Page 1
憂鬱なSQLのためのアレ
PHP-BLT #4
公開日:
by USAMI Kenta @tadsan
憂鬱なSQLのためのアレ
PHP-BLT #4
近況報告
PHPカンファレンス北海道で喋ってきました
近況報告
みんな大好きPDO
PHP Data Objects
Real World PHP
みんな事故る
文字列結合の温床
Real World PHP
$names = ["taro","jiro","saburo"];
$str = implode(",", array_map($name){
return sprintf('"%s"', $name);
});
$sql = "SELECT * FROM users WHERE name IN ($str)";
// ↑典型的な漏れのあるロジックの例
PDOのラッパー作った
警告:ちゃんとしたO/Rマッパーの方がいい
composer require zonuexe/tetosql
https://github.com/BaguettePHP/TetoSQL
<?php
namespace InspireBBS\Model;
use Teto\SQL;
/**
* 板を表現するモデル
* @copyright 2016 USAMI Kenta
* @license WTFPL
*/
final class Board {
/**
* @return Board[]
*/
public static function findAll() {
$data = SQL\Query::execute(db(), self::findAll_query, [])
->fetchAll(\PDO::FETCH_ASSOC) ?: [];
$boards = [];
foreach ($data as $b) {
$boards[] = new Board($b);
}
return $boards;
}
const findAll_query = 'SELECT `id`, `name`, `text` FROM `boards`';
}
use Teto\SQL;
public static function find($id) {
$data = SQL\Query::execute(db(), self::findAll_query, [
':id' => $id,
])->fetchAll(\PDO::FETCH_ASSOC) ?: [];
$boards = [];
foreach ($data as $b) {
$boards[] = new Board($b);
}
return $boards;
}
const find_query = ‘
SELECT `id`, `name`, `text` FROM `boards` WHERE `id` = $id@int
';
基本的なAPI
どうにかしてPDOのコネクションをとっておく
[':id' => $id, ':hoge' => $hoge] );
コネクション、SQL、アサインする値を渡す
const