如何正确使用PDO对象进行参数化SELECT查询

Joe*_*ips 85 php mysql select pdo

我已经尝试按照PHP.net的说明进行SELECT查询,但我不确定这样做的最佳方法.

我想使用参数化SELECT查询,如果可能的话,返回ID表中name字段与参数匹配的表.这应该返回一个,ID因为它将是唯一的.

然后我想将它ID用于INSERT另一个表,所以我需要确定它是否成功.

我还读到您可以准备查询以供重用,但我不确定这有何帮助.

tro*_*skn 158

您选择这样的数据:

$db = new PDO("...");
$statement = $db->prepare("select id from some_table where name = :name");
$statement->execute(array(':name' => "Jimbo"));
$row = $statement->fetch(); // Use fetchAll() if you want all results, or just iterate over the statement, since it implements Iterator
Run Code Online (Sandbox Code Playgroud)

您以相同的方式插入:

$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");
$statement->execute(array(':some_id' => $row['id']));
Run Code Online (Sandbox Code Playgroud)

我建议您将PDO配置为在出错时抛出异常.然后,PDOException如果任何查询失败,您将获得- 无需明确检查.要打开异常,请在创建$db对象后立即调用:

$db = new PDO("...");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Run Code Online (Sandbox Code Playgroud)

  • 对于行`$ statement-> execute(array(':name'=>"Jimbo"));`,你能解释一下Jimbo部分吗? (2认同)

Sma*_*ode 16

我最近一直在和PDO合作,上面的答案是完全正确的,但我只想记录以下内容.

$nametosearch = "Tobias";
$conn = new PDO("server", "username", "password");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sth = $conn->prepare("SELECT `id` from `tablename` WHERE `name` = :name");
$sth->bindParam(':name', $nametosearch);
// Or sth->bindParam(':name', $_POST['namefromform']); depending on application
$sth->execute();
Run Code Online (Sandbox Code Playgroud)

  • 不,它没有,因为您没有选择使用哪个数据库. (16认同)
  • 这实际上应该在"服务器"字符串中,该字符串实际上应该是"{driver}:dbname = {db_name}; host = {server}"形式的DSN,用您的连接需要替换大括号值 (3认同)

Gil*_*ong 12

您可以使用bindParambindValue方法来帮助准备您的陈述.它使第一眼看上去更清晰,而不是做$check->execute(array(':name' => $name));特别是如果你绑定多个值/变量.

查看下面清晰易读的示例:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname LIMIT 1");
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetch(PDO::FETCH_ASSOC);
    $row_id = $check['id'];
    // do something
}
Run Code Online (Sandbox Code Playgroud)

如果您期望多行删除LIMIT 1并将fetch方法更改为fetchAll:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname");// removed limit 1
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetchAll(PDO::FETCH_ASSOC);
    //$check will now hold an array of returned rows. 
    //let's say we need the second result, i.e. index of 1
    $row_id = $check[1]['id']; 
    // do something
}
Run Code Online (Sandbox Code Playgroud)


Dom*_*cel 6

这里有一个完整的答案,随时可以使用:

    $sql = "SELECT `username` FROM `users` WHERE `id` = :id";
    $q = $dbh->prepare($sql);
    $q->execute(array(':id' => "4"));
    $done= $q->fetch();

 echo $done[0];
Run Code Online (Sandbox Code Playgroud)

$dbh是PDO db connecter,基于idusers我们得到了username使用fetch();

我希望这有助于某人,享受!