如果已经提出要求,请道歉。我已经看到了有关静态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()?
我是否应该动态构建语句> execute(array(':param'=> $ var)))?
有更好/更整洁的方式吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
根据您的示例,更简洁的方式是循环而不是切换。
db-> prepare()允许您使用bindParam()或PDOStatement->exec()上的数组替换模式(在php.net上,示例在字段名称前放置一个冒号)。您可以使用? from examples 3 and 4代替命名字段值。
仍然需要为SQL语句知道所有字段。
答案 2 :(得分: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);