PHP MySQLi/PDO_MySQL/PDO_SQLite CRUD(添削添削)

14993 ワード

PHP MySQLi:http://php.net/mysqli
<?php

function db() {
	global $app;
	static $db; //1          1   .
	if ($db) {
		return $db;
	} else {
		$db = @new mysqli(
			$app['db_host'], 
			$app['db_user'], 
			$app['db_pass'], 
			$app['db_name'], 
			$app['db_port']
		);
	}
	if ($db->connect_errno) {
		echo $db->connect_error;
		exit();
	}
	$db->set_charset('utf8');
	return $db;
}

function insert($title = '', $content = '') {
	global $app;
	$db = db();
	$stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES (?, ?)');
	$stmt->bind_param('ss', $title, $content);
	$stmt->execute();
	return ($stmt->affected_rows !== 0) ? 
		array(true,  'insert_id' => $stmt->insert_id) : 
		array(false, 'insert_id' => $stmt->insert_id);
}

function select($id = '') {
	global $app;
	$db = db();
	if (!empty($id)) {
		return $db->query('SELECT * FROM posts WHERE id = '.intval($id))->fetch_all(MYSQLI_ASSOC);
	} else {
		return $db->query('SELECT * FROM posts')->fetch_all(MYSQLI_ASSOC);
	}
}

function select_v2($id = '') {
	global $app;
	$db = db();
	if (!empty($id)) {
		$stmt = $db->prepare('SELECT * FROM posts WHERE id = ?');
		$stmt->bind_param('i', $id);
	} else {
		$stmt = $db->prepare('SELECT * FROM posts');
	}
	$stmt->execute();
	//get_result fetch_all  mysqlnd  ,PHP 5.4    mysqlnd.
	return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}

function update($id, $title = '', $content = '') {
	global $app;
	$db = db();
	//var_export($db->query('SELECT @@autocommit')->fetch_all(MYSQLI_ASSOC)); exit(); //  1  MySQL         .
	$db->query('SET AUTOCOMMIT=0');  //$db->autocommit(false);
	//  ,InnoDB        (insert/update/delete)       .
	//  commit     autocommit      true,  delete            commit     .
	$db->query('START TRANSACTION'); //$db->begin_transaction(); PHP 5.5        .
	$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');
	$stmt->bind_param('ssi', $title, $content, $id);
	$stmt->execute();
	$db->query('COMMIT'); //$db->commit();
	//$db->query('ROLLBACK'); //$db->rollback();
	$db->query('SET AUTOCOMMIT=1'); //commit     autocommit      true
	//UPDATE ,               ,affected_rows    0.
	return ($stmt->affected_rows !== 0) ? true : false;
}

function delete($id) {
	global $app;
	$db = db();
	$db->query('DELETE FROM posts WHERE id = '.intval($id));
	return ($db->affected_rows !== 0) ? true : false;
}

function delete_v2($id) {
	global $app;
	$db = db();
	$stmt = $db->prepare('DELETE FROM posts WHERE id = ?');
	$stmt->bind_param('i', $id);
	$stmt->execute();
	return ($stmt->affected_rows !== 0) ? true : false;
}

header('Content-Type: text/plain; charset=utf-8');

//mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS tuxbase DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;GRANT ALL PRIVILEGES ON tuxbase.* TO [email protected] IDENTIFIED BY '913dab0c6788bb8f0';FLUSH PRIVILEGES;"
$app = array(
	'db_host' => '127.0.0.1',
	'db_user' => 'tux',
	'db_pass' => '913dab0c6788bb8f0',
	'db_name' => 'tuxbase',
	'db_port' => 3306
);

$table = "CREATE TABLE IF NOT EXISTS posts (
	id           int(10) unsigned NOT NULL AUTO_INCREMENT,
	post_title   varchar(255)     NOT NULL DEFAULT '',
	post_content text             NOT NULL DEFAULT '',
	PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;";

db()->query('DROP TABLE IF EXISTS posts;') or exit();
db()->query($table) or exit();

echo "var_export(insert('  1', '  1'));
"; var_export(insert(' 1', ' 1')); echo "

"; echo "var_export(insert(' 2', ' 2'));
"; var_export(insert(' 2', ' 2')); echo "

"; echo "var_export(select());
"; var_export(select()); echo "

"; echo "var_export(update(2, ' 2_ ',' 2_ '));
"; var_export(update(2, ' 2_ ',' 2_ ')); echo "

"; echo "var_export(select(2));
"; var_export(select(2)); echo "

"; echo "var_export(delete(2));
"; var_export(delete(2)); echo "

"; echo "var_export(select());
"; var_export(select()); echo "

";
PHP PDO_MySQL:http://php.net/pdo
<?php

function db() {
	global $app;
	static $db;
	if ($db) {
		return $db;
	} else {
		/* MySQL */
		try {
			$dsn = "mysql:dbname=$app[db_name];host=$app[db_host];port=$app[db_port];charset=utf8";
			$db = new PDO($dsn, $app['db_user'], $app['db_pass'], array(
				PDO::ATTR_PERSISTENT => false,
				PDO::ATTR_EMULATE_PREPARES => false,
				PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
			));
		} catch (PDOException $e) {
			echo $e->getMessage();
			exit();
		}
		
		/* SQLite 
		try {
			$db = new PDO('sqlite:'.dirname(__FILE__).'/data.db3');
		} catch (PDOException $e) {
			echo $e->getMessage();
			exit();
		}
		*/
	}
	return $db;
}

function insert($title = '', $content = '') {
	global $app;
	$db = db();
	$stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES (?, ?)');
	$stmt->bindParam(1, $title,   PDO::PARAM_STR);
	$stmt->bindParam(2, $content, PDO::PARAM_STR);
	$stmt->execute();
	return ($stmt->rowCount() !== 0) ? 
		array(true,  'lastInsertId' => $db->lastInsertId()) : 
		array(false, 'lastInsertId' => $db->lastInsertId());
}

function select($id = '') {
	global $app;
	$db = db();
	if (!empty($id)) {
		return $db->query('SELECT * FROM posts WHERE id = '.intval($id))->fetchAll(PDO::FETCH_ASSOC);
	} else {
		return $db->query('SELECT * FROM posts')->fetchAll(PDO::FETCH_ASSOC);
	}
}

function select_v2($id = '') {
	global $app;
	$db = db();
	if (!empty($id)) {
		$stmt = $db->prepare('SELECT * FROM posts WHERE id = ?');
		$stmt->bindParam(1, $id, PDO::PARAM_INT);
	} else {
		$stmt = $db->prepare('SELECT * FROM posts');
	}
	$stmt->execute();
	return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function update($id, $title = '', $content = '') {
	global $app;
	$db = db();
	
	//echo PDO::ATTR_AUTOCOMMIT; //  0  PDO          .
	//echo $db->getAttribute(PDO::ATTR_AUTOCOMMIT); exit(); //  1  MySQL         .
	
	//SQLite     PDO::ATTR_AUTOCOMMIT:
	//SQLite: Uncaught exception 'PDOException' with message 'The auto-commit mode cannot be changed for this driver'
	$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
	$db->beginTransaction();
	$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');
	
	$stmt->execute(array($title,$content,$id)); //     PDO::PARAM_STR  
	//$stmt->execute(array(':title' => $title,':content' => $content,':id' => $id));
	//$stmt->bind_param('ssi', $title, $content, $id); //  mysqli
	
	echo 'sleep(3);'."
"; sleep(3); $db->commit(); $db->setAttribute(PDO::ATTR_AUTOCOMMIT, true); //commit autocommit true return ($stmt->rowCount() !== 0) ? true : false; } function delete($id) { global $app; $db = db(); return ($db->query('DELETE FROM posts WHERE id = '.intval($id))->rowCount() !== 0) ? true : false; } function delete_v2($id) { global $app; $db = db(); $stmt = $db->prepare('DELETE FROM posts WHERE id = ?'); $stmt->bindParam(1, $id, PDO::PARAM_INT); $stmt->execute(); return ($stmt->rowCount() !== 0) ? true : false; } header('Content-Type: text/plain; charset=utf-8'); $app = array( 'db_host' => '127.0.0.1', 'db_user' => 'tux', 'db_pass' => '913dab0c6788bb8f0', 'db_name' => 'tuxbase', 'db_port' => 3306 ); $mysql = "CREATE TABLE IF NOT EXISTS posts ( id int(10) unsigned NOT NULL AUTO_INCREMENT, post_title varchar(255) NOT NULL DEFAULT '', post_content text NOT NULL DEFAULT '', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;"; $sqlite = "CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY, post_title VARCHAR(255) NOT NULL, post_content TEXT NOT NULL )"; db()->query('DROP TABLE IF EXISTS posts;') or exit(); db()->query($mysql) or exit(); // ,SQLite insert echo "var_export(insert(' 1', ' 1'));
"; var_export(insert(' 1', ' 1')); echo "

"; echo "var_export(insert(' 2', ' 2'));
"; var_export(insert(' 2', ' 2')); echo "

"; echo "var_export(select());
"; var_export(select()); echo "

"; echo "var_export(update(2, ' 2_ ',' 2_ '));
"; var_export(update(2, ' 2_ ',' 2_ ')); echo "

"; echo "var_export(select(2));
"; var_export(select(2)); echo "

"; echo "var_export(delete(2));
"; var_export(delete(2)); echo "

"; echo "var_export(select());
"; var_export(select()); echo "

";
PHP PDO_SQLite:
<?php

function db() {
	global $app;
	static $db;
	if ($db) {
		return $db;
	} else {
		/* MySQL 
		try {
			$dsn = "mysql:dbname=$app[db_name];host=$app[db_host];port=$app[db_port];charset=utf8";
			$db = new PDO($dsn, $app['db_user'], $app['db_pass'], array(
				PDO::ATTR_PERSISTENT => false,
				PDO::ATTR_EMULATE_PREPARES => false,
				PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
			));
		} catch (PDOException $e) {
			echo $e->getMessage();
			exit();
		}
		*/
		/* SQLite */
		try {
			$db = new PDO('sqlite:'.dirname(__FILE__).'/data.db3');
		} catch (PDOException $e) {
			echo $e->getMessage();
			exit();
		}
		
	}
	return $db;
}

function insert($title = '', $content = '') {
	global $app;
	$db = db();
	$stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES (?, ?)');
	$stmt->bindParam(1, $title,   PDO::PARAM_STR);
	$stmt->bindParam(2, $content, PDO::PARAM_STR);
	$stmt->execute();
	return ($stmt->rowCount() !== 0) ? 
		array(true,  'lastInsertId' => $db->lastInsertId()) : 
		array(false, 'lastInsertId' => $db->lastInsertId());
}

function select($id = '') {
	global $app;
	$db = db();
	if (!empty($id)) {
		return $db->query('SELECT * FROM posts WHERE id = '.intval($id))->fetchAll(PDO::FETCH_ASSOC);
	} else {
		return $db->query('SELECT * FROM posts')->fetchAll(PDO::FETCH_ASSOC);
	}
}

function select_v2($id = '') {
	global $app;
	$db = db();
	if (!empty($id)) {
		$stmt = $db->prepare('SELECT * FROM posts WHERE id = ?');
		$stmt->bindParam(1, $id, PDO::PARAM_INT);
	} else {
		$stmt = $db->prepare('SELECT * FROM posts');
	}
	$stmt->execute();
	return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

function update($id, $title = '', $content = '') {
	global $app;
	$db = db();
	
	//echo PDO::ATTR_AUTOCOMMIT; //  0  PDO          .
	//echo $db->getAttribute(PDO::ATTR_AUTOCOMMIT); exit(); //  1  MySQL         .
	
	//SQLite     PDO::ATTR_AUTOCOMMIT:
	//SQLite: Uncaught exception 'PDOException' with message 'The auto-commit mode cannot be changed for this driver'
	//$db->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
	$db->beginTransaction();
	$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');
	
	$stmt->execute(array($title,$content,$id)); //     PDO::PARAM_STR  
	//$stmt->execute(array(':title' => $title,':content' => $content,':id' => $id));
	//$stmt->bind_param('ssi', $title, $content, $id); //  mysqli
	
	echo 'sleep(3);'."
"; sleep(3); $db->commit(); //$db->setAttribute(PDO::ATTR_AUTOCOMMIT, true); //commit autocommit true return ($stmt->rowCount() !== 0) ? true : false; } function delete($id) { global $app; $db = db(); return ($db->query('DELETE FROM posts WHERE id = '.intval($id))->rowCount() !== 0) ? true : false; } function delete_v2($id) { global $app; $db = db(); $stmt = $db->prepare('DELETE FROM posts WHERE id = ?'); $stmt->bindParam(1, $id, PDO::PARAM_INT); $stmt->execute(); return ($stmt->rowCount() !== 0) ? true : false; } header('Content-Type: text/plain; charset=utf-8'); $app = array( 'db_host' => '127.0.0.1', 'db_user' => 'tux', 'db_pass' => '913dab0c6788bb8f0', 'db_name' => 'tuxbase', 'db_port' => 3306 ); $mysql = "CREATE TABLE IF NOT EXISTS posts ( id int(10) unsigned NOT NULL AUTO_INCREMENT, post_title varchar(255) NOT NULL DEFAULT '', post_content text NOT NULL DEFAULT '', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;"; $sqlite = "CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY, post_title VARCHAR(255) NOT NULL, post_content TEXT NOT NULL )"; db()->query('DROP TABLE IF EXISTS posts;') or exit(); db()->query($sqlite) or exit(); // ,SQLite insert echo "var_export(insert(' 1', ' 1'));
"; var_export(insert(' 1', ' 1')); echo "

"; echo "var_export(insert(' 2', ' 2'));
"; var_export(insert(' 2', ' 2')); echo "

"; echo "var_export(select());
"; var_export(select()); echo "

"; echo "var_export(update(2, ' 2_ ',' 2_ '));
"; var_export(update(2, ' 2_ ',' 2_ ')); echo "

"; echo "var_export(select(2));
"; var_export(select(2)); echo "

"; echo "var_export(delete(2));
"; var_export(delete(2)); echo "

"; echo "var_export(select());
"; var_export(select()); echo "

";