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 ...
随机推荐
- 面试必问:HashMap 底层实现原理
HashMap是在面试中经常会问的一点,很多时候我们仅仅只是知道HashMap他是允许键值对都是Null,并且是非线程安全的,如果在多线程的环境下使用,是很容易出现问题的. 这是我们通常在面试中会说的 ...
- 【神经网络与深度学习】生成式对抗网络GAN研究进展(五)——Deep Convolutional Generative Adversarial Nerworks,DCGAN
[前言] 本文首先介绍生成式模型,然后着重梳理生成式模型(Generative Models)中生成对抗网络(Generative Adversarial Network)的研究与发展.作者 ...
- cad.net 依照旧样条曲线数据生成一条新样条曲线的代码段. spline生成
Spline spl = entity as Spline; //拿到旧的spline图元... //样条曲线生成条件 var controlPoints = new Point3dCollectio ...
- 乘法器——Wallace树型乘法器
博主最近在看乘法器相关的知识,发现现在用的比较多的是booth编码的乘法器和Wallace树型乘法器,当然两者并不是互斥的关系,他们也可以结合使用.在这里给大家介绍一下Wallace树型乘法器,希望能 ...
- 百度云 2G 4核 服务器拼团链接
拼团链接如下: https://cloud.baidu.com/campaign/ABCSale-2019/index.html?teamCode=P3D6DV8T
- 网络编程中用到的SOCKET是什么?
摘取网络上的一些内容: 什么是TCP/IP.UDP? Socket在哪里呢? Socket是什么呢? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protoc ...
- 【转】socket通信-C#实现tcp收发图片音视频等字节流数据
在日常碰到的项目中,经常碰到需要收发二进制数据的场景.比如要发送一张图片,要发送一首音频,要发送一个压缩包,要发送一个视频等等.这些数据并非字符串,而是二进制字节流数据.那么如何如何使用SharpSo ...
- WPF 在MVVM模式下弹出子窗体的方式
主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来 ...
- 前端1-----CSS层叠样式表了解,css的引入方式,三大选择器(标签,类,id),高级选择器
前端1-----CSS层叠样式表了解,css的引入方式,三大选择器(标签,类,id),高级选择器 一丶CSS简介 叠样式表(英文全称:Cascading Style Sheets)是一种用来表现 ...
- VC/MFC如何添加启动界面
2015-05 转自 香远益清原文VC/MFC如何添加启动界面 1.基于框架类的应用程序添加启动画面的步骤(利用组件库中的Splash Screen组件生成Splash1.cpp 和Splash1.h ...