1

これがすでに尋ねられている場合はお詫び申し上げます。静的 SQL に関する回答を見てきましたが、この場合、実行時に動的に構築されるクエリ文字列に PDO->prepare() を使用したいと思います。

簡単な例に分解します。

$TempSQL = "SELECT field1, field2, field3 FROM table WHERE ";

if ($numberParams == 1) {
    $TempSQL = $TempSQL . " field1 = '$val1' ";
} else {
    $TempSQL = $TempSQL . " field2 = '$val2' ";
    $TempSQL = $TempSQL . " AND field3 = '$val3' ";
}

db->query($TempSQL);

これを db->prepare() として書き直すにはどうすればよいですか?

statement->execute(array(':param' => $var))) もその場で作成する必要がありますか?

より良い/きちんとした方法はありますか?

4

3 に答える 3

2

おそらく、このようなものです。(未テスト)

$TempSQL = "SELECT field1, field2, field3 FROM table WHERE ";
$args=array();

if ($numberParams == 1) {
    $TempSQL = $TempSQL . " field1 = :val1"
    $args[':val1']=$val1;
} else {
    $TempSQL = $TempSQL . " field2 = :val2 and field3 = :val3";
    $args[':val2']=$val2;
    $args[':val3']=$val3;
}

$stmt=$db->prepare($TempSQL);
$stmt->execute($args);
于 2009-02-25T06:23:33.027 に答える
0

あなたの例に基づいて、よりきちんとした方法は、切り替えではなくループになります。

db->prepare() を使用すると、 bindParam() またはPDOStatement->exec() の配列を使用して、パターンを置き換えることができます (php.net では、例ではフィールド名の前にコロンを付けています)?を使用できます。フィールド値に名前を付ける代わりに、例 3 と 4 から。

SQL ステートメントのすべてのフィールドが認識されている必要があります。

于 2009-02-24T21:44:34.817 に答える
0
$TempSQL = 'SELECT field1, field2, field3 FROM table';
$cond = array();
$params = array();
if (!empty($val1)) {
    $cond[] = "field1 = ?";
    $params[] = $val1;
}
if (!empty($val2)) {
    $cond[] = "field2 = ?";
    $params[] = $val2;
}
if (!empty($val3)) {
    $cond[] = "field3 = ?";
    $params[] = $val3;
}
if (count($cond)) {
    $TempSQL .= ' WHERE ' . implode(' AND ', $cond);
}
$stmt = $pdo->prepare($TempSQL);
$stmt->execute($params);
于 2015-08-03T06:34:03.863 に答える