PHP操作MYSQL--PDO
感觉比直接弄SQL语句高级,但还不到ORM的封装。
一步一步进化。
app.json
{ "db": { "user": "root", "password": "xxxx", "host": "10.2.3.4", "port": "3306", "dbname": "bookstore" } }
config.php
<?php namespace Bookstore\Utils; use Bookstore\Exceptions\NotFoundException; require_once __DIR__ . '/NotFoundException.php'; class Config { private $data; //类静态变量,保证变量唯一性 private static $instance; //构造函数私有化,类外部不可以调用. private function __construct() { $json = file_get_contents(__DIR__ . '/app.json'); $this->data = json_decode($json, true); } //单例模式,保证只实例化一个类. public static function getInstance() { if (self::$instance == null) { //是可以自己实例化自己的. self::$instance = new Config(); } return self::$instance; } public function get($key) { if (!isset($this->data[$key])) { throw new NotFoundException("Key $key not in config."); } return $this->data[$key]; } } ?>
test.php
<?php //使用命名空间,易于在大型应用中管理和组织php类. use Bookstore\Utils\Config; //命名空间可以直接use,但如果这个命名空间没有在标准约定位置,且没有自动载入的话,需要使用require来手工定位一下. require_once __DIR__ . '\Config.php'; header("content-type:text/html;charset=utf-8"); $dbConfig = Config::getInstance()->get("db"); $connStr = "mysql:host={$dbConfig['host']};port={$dbConfig['port']};dbname={$dbConfig['dbname']};charset=utf8"; $db = new \PDO($connStr, $dbConfig['user'], $dbConfig['password']); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $query = 'SELECT * FROM book WHERE author = :author'; $statement = $db->prepare($query); $statement->bindValue('author', 'George Orwell'); $statement->execute(); $rows = $statement->fetchAll(); foreach ($rows as $row) { var_dump($row); } echo "<br/>"; $query = <<<SQL INSERT INTO book(isbn, title, author, price) VALUES(:isbn, :title, :author, :price) SQL; $statement = $db->prepare($query); $params = [ 'isbn' => '9781413108614', 'title' => 'Iliad', 'author' => 'Homer', 'price' => 9.25 ]; $statement->execute($params); $result = $db->exec($query); echo $db->lastInsertId(); echo "<br/>"; function addBook(int $id, int $amount=1):void { $query = 'UPDATE book SET stock = stock + :n WHERE id = :id'; $statement = $db->prepare($query); $statement->bindValue('id', $id); $statement->bindValue('n', $amount); if (!$statement->execute()) { throw new Exception($statement->errorInfo()[2]); } } function addSale($db, int $userId, array $bookIds):void { $db->beginTransaction(); try { $query = 'INSERT INTO sale(customer_id, date)' . 'VALUES(:id, NOW())'; $statement = $db->prepare($query); if (!$statement->execute(['id'=> $userId])) { throw new Exception($statement->errorInfo()[2]); } $saleId = $db->lastInsertId(); $query = 'INSERT INTO sale_book(book_id, sale_id)' . 'VALUES(:book, :sale)'; $statement = $db->prepare($query); $statement->bindValue('sale', $saleId); foreach ($bookIds as $bookId) { $statement->bindValue('book', $bookId); if (!$statement->execute()) { throw new Exception($statement->errorInfo()[2]); } } $db->commit(); } catch (Exception $e) { $db->rollback(); throw $e; } } try { addSale($db, 1, [1, 2, 300]); } catch (Exception $e) { echo 'Error adding sale: ' . $e->getMessage(); } try { addSale($db, 1, [1, 2, 3]); } catch (Exception $e) { echo 'Error adding sale: ' . $e->getMessage(); } ?>
输出
array(6) { ["id"]=> string(1) "1" ["isbn"]=> string(13) "9780882339726" ["title"]=> string(4) "1984" ["author"]=> string(13) "George Orwell" ["stock"]=> string(2) "12" ["price"]=> string(3) "8.7" } array(6) { ["id"]=> string(1) "3" ["isbn"]=> string(13) "9780736692427" ["title"]=> string(11) "Animal Farm" ["author"]=> string(13) "George Orwell" ["stock"]=> string(1) "8" ["price"]=> string(4) "4.06" } 0 Error adding sale: Cannot add or update a child row: a foreign key constraint fails (`bookstore`.`sale_book`, CONSTRAINT `sale_book_ibfk_2` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`))
PHP操作MYSQL--PDO的更多相关文章
- MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL
[转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...
- php笔记08:数据库编程---使用php的MySQL扩展库操作MySQL数据库
1.使用php的MySQL扩展库操作MySQL数据库: php有3种方式操作MySQL数据库 (1)mysql扩展库 (2)mysqli扩展库 (3)pdo mysql扩展库与mysql数据库 ...
- php mysql PDO使用
<?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', ''); $dbh->setAttri ...
- ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)
操作 MySql 数据库使用MySql.Data程序包(MySql 开发,其他第三方可能会有些问题). project.json 代码: { "version": "1. ...
- Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy
本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...
- EF操作MySql
EF的CodeFrist操作MySql的提前准备: 1.安装两个包:MySql.Data和MySql.Data.Entity,在VS中程序包管理器中添加2个包.(备注需要的VS2015,并且EF6支持 ...
- .NET Core 使用Dapper 操作MySQL
MySQL官方驱动:http://www.cnblogs.com/linezero/p/5806814.html .NET Core 使用Dapper 操作MySQL 数据库, .NET Core 使 ...
- asp.net core 1.1 升级后,操作mysql出错的解决办法。
遇到问题 core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新.插入操作没有问题. 如果你也遇到这个问题,请参照以下步骤进行升 ...
- 练习:python 操作Mysql 实现登录验证 用户权限管理
python 操作Mysql 实现登录验证 用户权限管理
- Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...
随机推荐
- 简单说说JavaScript的Generator 实现(ES6)
Generator 是 ES6 中新增的语法,和 Promise 一样,都可以用来异步编程 // 使用 * 表示这是一个 Generator 函数 // 内部可以通过 yield 暂停代码 // 通过 ...
- prometheus自定义监控指标——入门
grafana结合prometheus提供了大量的模板,虽然这些模板几乎监控到了常见的监控指标,但是有些特殊的指标还是没能提供(也可能是我没找到指标名称).受zabbix的影响,自然而然想到了自定义监 ...
- 【C/C++开发】C++11 并发指南三(std::mutex 详解)
本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...
- linux ----------- 在VM上 的安装 centos
1.虚拟机的安装步骤 2.什么是虚拟机 通过软件来模拟硬件的功能 3.主流的虚拟机 Vmware Workstation 简称Vmware 4.虚拟机下载地址https://www.vmware.co ...
- JSR223 PostProcessor VS BeanShell PostProcessor in JMeter
I would recommend using JSR223 PostProcessor About performance: In JMeter's official user manual, Ab ...
- lower_bound()和upper_bound()
lower_bound()和upper_bound() 是方便的在有序数组中二分查找的函数,并且在STL其他数据结构中也提供该方法(如map和set). 但是两函数并不是二分查找"小于&qu ...
- Codeforces 878 E. Numbers on the blackboard
Codeforces 878 E. Numbers on the blackboard 解题思路 有一种最优策略是每次选择最后面一个大于等于 \(0\) 的元素进行合并,这样做完以后相当于给这个元素乘 ...
- c# 创建Excel com加载项Ribbon动态加载工作簿和工作表
使用 VSTO 创建外接程序,Gallery控件动态加载工作簿名称 代码如下: 加载工作簿名称: private void Gallery1_ItemsLoading(object sender, R ...
- 关于win server中 task Scheduler使用
日常开发过程中最会遇到很多定时任务,利用计算机自带的软件工具,既方便,又快捷,能节省大量的开发时间,而且功能全面,容错率高. 下面举个例子:定时发送邮件,每天8:10准时触发邮件发送脚本 1.首先配置 ...
- javascript 对象之hasOwnProperty()方法
hasOwnProperty()方法是判断某一个对象是否有你给出的属性名称,需要注意的是该方法无法检测该对象原型连中是否具有该属性 具体格式下: var person = {"name&qu ...