猿问

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

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

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

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

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


慕少森
浏览 787回答 3
3回答

至尊宝的传说

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

交互式爱情

您可以使用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}
随时随地看视频慕课网APP
我要回答