如何正确使用参数化的SELECT查询的PDO对象
我试过按照PHP.net的说明做SELECT
查询,但我不知道这样做的最好方法。
我想使用参数化的SELECT
查询,如果可能的话,返回name
字段与参数匹配的表中的ID
。 这应该返回一个ID
因为它是唯一的。
然后我想用这个ID
来INSERT
另一个表,所以我需要确定它是否成功。
我也读过,你可以准备查询重用,但我不知道这是如何帮助。
你select这样的数据:
$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']));
我build议你configurationPDO在错误时抛出exception。 如果任何查询失败,那么您将得到一个PDOException
– 无需显式检查。 要打开exception,请在创build$db
对象后立即调用它:
$db = new PDO("..."); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
我最近一直在使用PDO,上面的答案是完全正确的,但我只是想logging下面的工作。
$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));
特别是如果你绑定多个值/variables。
检查清晰,易于阅读的例子如下:
$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
并将获取方法更改为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, ie index of 1 $row_id = $check[1]['id']; // do something }
一个完整的答案就在这里,所有的准备使用:
$sql = "SELECT `username` FROM `users` WHERE `id` = :id"; $q = $dbh->prepare($sql); $q->execute(array(':id' => "4")); $done= $q->fetch(); echo $done[0];
这里$dbh
是PDO数据库连接器,并且基于来自表users
id
,我们使用fetch();
username
fetch();
我希望这可以帮助别人,享受!
方法1:使用PDO查询方法
$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"'); $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
获得行数
$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"'); $row_count = $stmt->rowCount(); echo $row_count.' rows selected';
方法2:带参数的语句
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?"); $stmt->execute(array($name)); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
方法3:绑定参数
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?"); $stmt->bindValue(1, $name, PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); **bind with named parameters** $stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name"); $stmt->bindValue(':name', $name, PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); or $stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name"); $stmt->execute(array(':name' => $name)); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
想知道更多看这个链接
如果您在单页中使用内联编码,而不是使用oops而不是使用这个完整的示例,它肯定会有帮助
//connect to the db $dbh = new PDO('mysql:host=localhost;dbname=mydb', dbuser, dbpw); //build the query $query="SELECT field1, field2 FROM ubertable WHERE field1 > 6969"; //execute the query $data = $dbh->query($query); //convert result resource to array $result = $data->fetchAll(PDO::FETCH_ASSOC); //view the entire array (for testing) print_r($result); //display array elements foreach($result as $output) { echo output[field1] . " " . output[field1] . "<br />"; }