Извиняюсь, если это уже было задано. Я видел ответы на статические 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))) на лету?
Есть ли лучший способ?
Возможно, что-то вроде этого. (Непроверенные)
$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);
Исходя из вашего примера, более простой способ – это цикл вместо переключения.
db-> prepare () позволяет вам заменять шаблоны (на php.net, пример помещает двоеточие перед именем поля) с помощью bindParam () или массива в PDOStatement-> exec () . Вы можете использовать ? из примеров 3 и 4 вместо обозначения значений полей.
Он по-прежнему требует, чтобы все поля были известны для оператора SQL.
$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);