kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

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 参照)