简体   繁体   English

WHERE 子句与 PDO 混淆

[英]WHERE clause confusion with PDO

I'm having some trouble understanding how to use prepared statements, when you need to match one value against several columns at once.当您需要一次将一个值与多个列进行匹配时,我在理解如何使用准备好的语句时遇到了一些麻烦。

In other words what instead of doing this:换句话说,不是这样做:

$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
$stmt->bindParam(1, $name); 

I wanted to do this:我想这样做:

$stmt = $dbh->prepare("SELECT * FROM REGISTRY where firstname = ? or lastname = ?");

with both '?'既 '?' representing the same string.表示相同的字符串。

Try...尝试...

$stmt = $dbh->prepare("SELECT * FROM registry WHERE firstname = :name OR lastname = :name;");
$stmt->bindParam(':name', $name); 

Why not just use a named parameter:为什么不直接使用命名参数:

$stmt = $dbh->prepare("SELECT * FROM REGISTRY WHERE firstname = :name OR lastname = :name");
$stmt->bindParam(':name', $name);

While all of the above answers do work, they won't work with so called "true prepared statements".虽然上述所有答案都有效,但它们不适用于所谓的“真正准备好的陈述”。 You will get an error that says "Parameter was not defined" or something similar.您将收到一条错误消息,指出“未定义参数”或类似内容。

What you need to do then is to just specify two different named parameters and bind the same value.您需要做的就是指定两个不同的命名参数并绑定相同的值。

For example:例如:

$stmt = $db->prepare(
    "SELECT * FROM registry WHERE firstname = :firstname OR lastname = :lastname"
);
$stmt->execute(array(":firstname" => $name, ":lastname" => $name));

You can enable true prepared statements the following way:您可以通过以下方式启用真正的准备好的语句:

$options = [ PDO::ATTR_EMULATE_PREPARES => false ];
$pdo = new PDO($dsn, "username", "password", $options);
$stmt = $dbh->prepare("SELECT * FROM registry WHERE firstname = ? 
OR lastname = ? ;");
$stmt->bindParam(1, $name);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM