Как мне построить параметризованный оператор PDO в PHP для динамического запроса? - PullRequest
1 голос
/ 25 февраля 2009

Извините, если об этом уже спрашивали. Я видел ответы относительно статического 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))) также на лету?

Есть ли лучший / аккуратный способ?

Ответы [ 3 ]

2 голосов
/ 25 февраля 2009

Возможно, что-то вроде этого. (Непроверенные)

$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);
0 голосов
/ 03 августа 2015
$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);
0 голосов
/ 25 февраля 2009

Исходя из вашего примера, более аккуратным способом будет цикл вместо переключения.

db-> prepare () позволяет заменять шаблоны (на php.net в качестве примера ставится двоеточие перед именем поля), используя bindParam () или массив в PDOStatement-> exec ( ) . Вы можете использовать ? из примеров 3 и 4 вместо именования значений полей.

Требуется, чтобы все поля были известны для оператора SQL.

...