我已经尝试按照PHP.net说明进行SELECT
查询,但是我不确定执行此操作的最佳方法。
SELECT
如果可能,我想使用参数化查询来返回ID
表中name
字段与参数匹配的表。这应该返回一个,ID
因为它将是唯一的。
然后,我想将其ID
用于INSERT
另一个表,因此我需要确定它是否成功。
我还读到您可以准备查询以供重用,但是我不确定这有什么帮助。
Answers:
您选择像这样的数据:
$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);
$db = new PDO('mysql:dbname=your_database;host=localhost', 'junior', '444');
$statement->execute(array(':name' => "Jimbo"));
,您能解释一下Jimbo部分吗?
:name
。execute
此处的调用是通过占位符->值对的关联数组来完成的。因此,在这种情况下,:name
占位符将替换为字符串Jimbo。请注意,它不是简单地执行字符串替换,因为该值会转义或通过与实际查询不同的通道发送,从而防止了任何类型的注入攻击。
我最近一直在与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
}
$check = $q->fetch(PDO::FETCH_ASSOC); if (!empty($check)){ $row_id = $check['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 db连接器,根据id
表,users
我们可以username
使用fetch();
我希望这可以帮助某人,尽情享受!
fetchColumn()
以避免[0]
被需要。另外,请记住要LIMIT 1
在SQL中使用。
方法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 />";
}
field > 6969
看起来是硬编码而不是参数化的。