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 回答