感觉比直接弄SQL语句高级,但还不到ORM的封装。

一步一步进化。

app.json

{"db": {"user": "root","password": "xxxx","host": "10.2.3.4","port": "3306","dbname": "bookstore"}
}

config.php

<?phpnamespace 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`))

转载于:https://www.cnblogs.com/aguncn/p/11133713.html

PHP操作MYSQL--PDO相关推荐

  1. php使用pdo操作mysql数据库实例_php5使用pdo连接数据库实例

    本文为大家介绍下php pdo的用法. 一,pdo简介 pdo(php data object) 是php 5 中加入的东西,是php 5新加入的一个重大功能,因为在php 5以前的php4/php3 ...

  2. PDO操作MYSQL

    <?php//PDO操作mysql数据库 增删改查//1.准备dsn$mysql_dsn="mysql:host=localhost;dbname=cz;charset=utf8&qu ...

  3. php mysql PDO 查询操作的实例详解

    php mysql PDO 查询操作的实例详解 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...

  4. php使用pdo操作mysql数据库实例_php使用PDO操作MySQL数据库实例_PHP

    本文实例讲述了php使用PDO操作MySQL数据库的方法.分享给大家供大家参考.具体分析如下: PDO是mysql数据库操作的一个公用类,我们不需要进行自定类就可以直接使用pdo来操作数据库,但是在p ...

  5. php mysql 替换 pdo,php操作MySQL数据库之PDO方式

    这篇文章主要介绍了关于php操作MySQL数据库之PDO方式 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下基本使用 1)连接数据库$pdo = new PDO("mysql ...

  6. pdo mysql 绑定查询_php mysql PDO 查询操作的实例详解

    php mysql PDO 查询操作的实例详解 php mysql PDO 查询操作的实例详解 这篇文章主要介绍了php mysql PDO 查询操作的实例详解的相关资料,希望通过本文能帮助到大家,需 ...

  7. [share]PDO操作MySql类

    转载自 分享 最终编辑 liujijunbd 为了让自己的数据类能够做到最大化的重用,就写个能够重用的PDO操作MySql的类: 由于pdo可以连接现在流行的各种数据库,所以单独的写个配置类类来完成不 ...

  8. php mysql pdo use_PHP连接到mysql的方法--mysqli和PDO

    php连接到mysql数据库,经典的方式就是使用mysql_connect(),具体代码如下: mysql_connect($db_host, $db_user, $db_pass) or die(m ...

  9. php mysql增修删_PHP mysql PDO增、删、查、改

    1 建立连接<?php $dbh=newPDO('mysql:host=localhost;port=3306; dbname=test',$user,$pass,array( PDO::ATT ...

  10. mysql pdo教程_php中mysql连接方式PDO使用详解

    本文主要详细介绍了PHP中mysql的连接方式PDO的各种使用方法,算是个人的一个小结,如有遗漏还请告之,有需要的小伙伴来参考下吧. PDO常用方法: PDO::query()主要用于有记录结果返回的 ...

最新文章

  1. LeetCode 94. Binary Tree Inorder Traversal--二叉树中序遍历--递归,迭代--C++,Python解法
  2. SharePoint 2013 术语和术语集介绍
  3. spark任务优先级设置:spark.yarn.priority
  4. mysql在线复制_mysql如何在线修改主从复制选项
  5. python 多进程 内存增长_python 多进程 内存 copy-on-write
  6. sql库缓存命中率_SQL Server内存性能指标–第4部分–缓冲区高速缓存命中率和页面寿命期望
  7. 在电脑窗口中截取长图/滚动截图
  8. Office Professional Plus 2010 产品密钥
  9. Limelight完成了对雅虎Edgecast的收购,合并后的公司更名为Edgio,成为全球边缘解决方案的领导者
  10. iphone计算机的声音怎么办,苹果计算机安装win10系统的扬声器无声音该怎么解决...
  11. C语言获取执行程序所在的目录路径
  12. Visio(一) Visio 键盘的上下左右快捷键 没办法移动图标了:取消掉Scroll lock指示灯即可。
  13. 【Windows 问题系列第 14 篇】如何删除 Win10 系统自带的微软拼音输入法
  14. 手把手教你六类网线水晶头接法,超详细教程
  15. job处理缓慢的性能问题排查与分析(r4笔记第18天)
  16. Ubuntu配置socks5转http
  17. 单点登录简单原理(应用多系统)
  18. 考研英语 长难句训练day68
  19. 网页素材大宝库:40套高质量的网站纹理背景素材
  20. Android 微信扫码登陆

热门文章

  1. 【翻译】QEMU内部机制:顶层概览
  2. vue2.x的小问题
  3. JVM----Java内存区域
  4. 使用C语言来实现模块化
  5. 查询数据(使用聚合函数,还是单表)
  6. 用ul和li实现表格table效果 (转)
  7. 2009 年 3月 二级 java
  8. Selenium常用API的使用java语言之7-控制浏览器操作
  9. 一个请求方法是一个线程吗?不是!
  10. js中三元运算符的两种情况