TOOL更新_DbManagerの中ですべての値をQuoteする。prepare statementみたいなロジックにする。
TOOL更新_DbManagerの中ですべての値をQuoteする。prepare statementみたいなロジックにする。(prepareメソッド使って見たが。PDOStatementからqueryStringがうまく取れないので。自分でSQL文作ることにした。)お助けTOOLのver0.1のやり方はやめる。quote漏れを防ぐためprepare statementの手法を真似ることにした。 (<=自動作成されたver0.1にquote漏れが見つかったわけではない。自動生成◎自動作成後に手作業でSQL文を作るときに漏れる恐れがあるので、、、ということ。プログラマのために、人的ミスを起こさないつくりにする。)
・呼び出しphpの例。(こういう呼び出し方法にしようと思う。昔調査した『Ethna』を参考にした。)
$result = $db->getAll("SELECT xxx from xxxxxx WHERE xxx = ? AND xxxx = ?" , array($xxx, $xxxx)); $result = $db->getRow("SELECT xxx from xxxxxx WHERE xxx = ? AND xxxx = ?" , array($xxx, $xxxx)); $count = $db->getOne("SELECT xxx from xxxxxx WHERE xxx = ? AND xxxx = ?" , array($xxx, $xxxx)); $db->query('UPDATE xxxxxxxxx SET xxx = ? WHERE xxxx = ?', array($xxx,$xxxx));
・DbManagerから抜粋。まだ実験中なので過去ブログに反映していない。パラメータに「値の置換文字?を指定したSQL文」と「値の配列」をもらう。「_sqlAndValQuote」メソッドでSQL文に値配列を埋め込んでquote処理する。INSERT処理、UPDATE処理、DELETE処理はQuery処理メソッド1つで処理するようにする。
■DbManager.php 抜粋 /** * getAll処理。<br> * @param $sql SQL文。値の置換文字は?で指定する。 * @param $ary 値の配列。 * @return 結果 */ public function getAll($sql, $ary=array()) { $sql = $this->_sqlAndValQuote($sql, $ary); // SQL文に値を埋めこむ。 $this->_outSqlLog($sql, 'getAll'); return $this->rtn2arr($this->_db->fetchAll($sql)); } ** * getRow処理。<br> * @param $sql SQL文。値の置換文字は?で指定する。 * @param $ary 値の配列。 * @return 結果 */ public function getRow($sql, $ary=array()) { $sql = $this->_sqlAndValQuote($sql, $ary); // 値を埋めこんだSQL文。 $this->_outSqlLog($sql, 'getRow'); return $this->rtn2arr($this->_db->fetchRow($sql)); } ** * getOne処理。<br> * @param $sql SQL文。値の置換文字は?で指定する。 * @param $ary 値の配列。 * @return 結果 */ public function getOne($sql, $ary=array()) { $sql = $this->_sqlAndValQuote($sql, $ary); // 値を埋めこんだSQL文。 $this->_outSqlLog($sql, 'getOne'); return $this->rtn2arr($this->_db->fetchOne($sql)); } ** * Query処理(INSERT処理、UPDATE処理、DELETE処理、その他)。<br> * @param $sql SQL文。値の置換文字は?で指定する。 * @param $ary 値の配列。 * @return 結果 */ public function query($sql, $ary=array()) { $sql = $this->_sqlAndValQuote($sql, $ary); // 値を埋めこんだSQL文。 $this->_outSqlLog($sql, 'query'); return $this->_db->query($sql); } ** * SQL文に値配列を埋め込んでquote処理する。<br> * @param $sql SQL文。値の置換文字は?で指定する。 * @param $ary 値の配列。 * @return 値を埋めこんだSQL文 */ protected function _sqlAndValQuote(&$sql, &$ary=array()) { $sqls = preg_split("/(\?)/", $sql, -1, PREG_SPLIT_DELIM_CAPTURE ); // ”?”で分割。”?”も配列に含める。 $i = 0; foreach((array)$sqls as $key => $sqlValue) { if ($sqlValue == "?") { // ”?”の場合 if (is_null($ary[$i])) { $sqls[$key] = 'null'; // 値埋め込む。 } else { $sqls[$key] = $this->_db->quote($ary[$i]); // 値埋め込む。 } $i++; } } $rtnSql = join('', $sqls); // 値を埋めこんだSQL文。 return $rtnSql; }
5/31 21:00-2:30
20/21 20:30-22:30 パラメータがnullのときの作成SQLが間違っていた。ので修正した。(http://d.hatena.ne.jp/kazpgm/20101021/1287667279 参照)