Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何正确地将PDO对象用于参数化SELECT查询_Php_Mysql_Select_Pdo - Fatal编程技术网

Php 如何正确地将PDO对象用于参数化SELECT查询

Php 如何正确地将PDO对象用于参数化SELECT查询,php,mysql,select,pdo,Php,Mysql,Select,Pdo,我已经尝试按照PHP.net的说明执行SELECT查询,但我不确定执行此操作的最佳方法 如果可能,我想使用参数化的SELECT查询,在name字段与参数匹配的表中返回ID。这应该返回一个ID,因为它是唯一的 然后我想使用该ID将插入到另一个表中,因此我需要确定它是否成功 我还了解到,您可以准备查询以供重用,但我不确定这有什么帮助。您选择的数据如下: $db = new PDO("..."); $statement = $db->prepare("select id from some_ta

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

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

然后我想使用该
ID
插入到另一个表中,因此我需要确定它是否成功


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

您选择的数据如下:

$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);

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

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

    $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()


我希望这对别人有帮助,享受吧

您可以使用
bindParam
bindValue
方法来帮助准备语句。 它让事情一眼就看得更清楚,而不是执行
$check->execute(数组(':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
}
如果需要多行请删除
限制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, i.e. index of 1
    $row_id = $check[1]['id']; 
    // do something
}

方法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 />";
}
//连接到数据库
$dbh=newpdo('mysql:host=localhost;dbname=mydb',dbuser,dbpw);
//构建查询
$query=“选择字段1,字段2
从ubertable
其中字段1>6969”;
//执行查询
$data=$dbh->query($query);
//将结果资源转换为数组
$result=$data->fetchAll(PDO::FETCH_ASSOC);
//查看整个阵列(用于测试)
打印(结果);
//显示数组元素
foreach($输出结果){
回波输出[field1]。“”。输出[field1]。“
”; }
我假设您指的是PDO语句,其中有新的PDO(…),对吗?不是。PDO是连接类(应该改名为PdoConnection)。连接可以创建PDO语句。在连接对象上调用setAttribute(),而不是单个语句。(或者,您可以将其传递给构造函数)这可能很有用:
$db=new PDO('mysql:dbname=your_数据库;host=localhost','junior','444')用于行
$statement->execute(数组(':name'=>“Jimbo”),你能解释一下Jimbo部分吗?@rar在前一行,查询是用占位符
:name
启动的。这里调用
execute
是通过占位符->值对的关联数组完成的。因此在本例中,
:name
占位符将替换为字符串Jimbo。请注意,它并不是简单地进行字符串替换,因为值要么转义,要么通过与实际查询不同的通道发送,从而防止任何类型的注入攻击。不,它没有,因为您没有选择要使用的数据库。这实际上应该在“服务器”字符串中,它实际上应该是一个DSN,格式为“{driver}”:dbname={db_name};host={server}”用连接所需的任何值替换花括号值不确定。对我来说似乎是一个合理的答案。我认为使用“myname”而不是“name”,以及使用多个参数而不是一个参数,都会使它受益。@GillianLoWong
$check=$q->fetch(PDO::fetch\u ASSOC)做什么;如果(!empty($check)){$row_id=$check['id'];//do something}
do?Hi@abdul,我已经替换了数组上的计数/空检查。它应该看看是否返回了任何结果。但是pdo还有一个名为rowCount()的函数,它允许您检查是否有任何行受到影响/被提取。如果您甚至不知道是否选择了任何行,那么获取数据是没有意义的,因此我将fetch语句移动到if rowCount()语句中:@Gillian La Wong感谢您针对多个where查询对bindValue的干净查询。保存我的项目。或者使用
fetchColumn()
避免需要
[0]
。另外,请记住在SQL中使用
限制1
。请删除方法1。虽然这个代码片段可以解决这个问题,但它没有解释为什么或者如何回答这个问题。请,因为这确实有助于提高你的文章质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。标记者/评论者:那么我应该删除什么呢?我的自我否定,恰恰相反。我在报纸上看到了这篇文章,所以我评论的后半部分是告诉人们不要投票删除。(相反,建议进行否决投票是为了提示临时否决票,这将在您的帖子编辑后删除。)如我之前的评论所述,如果您添加一个解释,说明您为什么建议使用您所使用的代码,会更好。同样,这个问题询问参数化查询,但是
field>6969
看起来是硬编码的,而不是参数化的。