为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕少森 2019-09-21 11:00:44

我已经尝试按照PHP.net说明进行SELECT查询,但是我不确定执行此操作的最佳方法。

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

然后,我想将其ID用于INSERT另一个表中,因此我将需要确定它是否成功。

我还读到您可以准备查询以供重用,但是我不确定这有什么帮助。


查看完整描述

3 回答

?
天涯尽头无女友

您选择像这样的数据:


$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

您以相同的方式插入:


$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");

$statement->execute(array(':some_id' => $row['id']));

我建议您将PDO配置为在出错时引发异常。PDOException如果任何查询失败,您将得到一个-无需显式检查。要打开异常,请在创建$db对象后立即调用此方法:


$db = new PDO("...");

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


查看完整回答
反对 回复 2019-09-21
?
至尊宝的传说

我最近一直在与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();


查看完整回答
反对 回复 2019-09-21
?
交互式爱情

您可以使用bindParam或bindValue方法来帮助准备您的陈述。它使事情看起来一目了然,而不是一目了然,$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

}

如果您期望多行,请删除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

}


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信