gpt4 book ai didi

PHP PDO 准备语句查询不更新记录

转载 作者:可可西里 更新时间:2023-11-01 13:27:16 27 4
gpt4 key购买 nike

我在使用 PHP 的 PDO 对象准备更新语句和更新记录时遇到问题。我采用原始 SQL 查询并在 phpMyAdmin 中运行它,其中的参数替换为传递给函数的值。按预期更新记录。但是,当从脚本运行时它不会更新。它抛出零错误并返回 00000 的 errorInfo() 回复,据我所知,这是 PDO 表示一切正常的方式。我知道 PDO 对象有效,因为它成功地从数据库中插入和选择记录,包括我试图更新的记录。我明白这个更新功能很难看,我只是在学习 PDO。

显然,这是使用 PDO 在 PHP5 中编码的。

类函数:

public function update($tbl_name, $where = null, $what = null)
{
if(is_array($where))
{
$where_str = 'where ';
foreach($where as $key => $val)
{
$where_str .= "{$key} = ':{$key}' and ";
}
$where_str = substr($where_str,0,-5);

$what_str = 'set ';
foreach($what as $key => $val)
{
$what_str .= "`{$key}` = ':{$key}', ";
}
$what_str = substr($what_str,0,-2);

$query_str = "update {$tbl_name} {$what_str} {$where_str} LIMIT 1;";
$stmt = $this->dbh->prepare($query_str);
echo '<pre>'.print_r($stmt, true).'</pre>';
foreach($what as $key => $val)
{
if('date_time' === $key) continue;
$bind = $stmt->bindValue(":{$key}",$val);
echo ($bind ? 'true' : 'false')." :{$key}=",$val,'<br/>';
}
foreach($where as $key => $val)
{
if('date_time' === $key) continue;
$bind = $stmt->bindValue(":{$key}",$val);
echo ($bind ? 'true' : 'false')." :{$key} ",$val,'<br/>';
}
}else{
return false;
}
$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$exec = $stmt->execute();
echo 'exec: '.($exec === true ? 'true:' : 'false:').':'.$exec.'<br/>';

echo '<pre>';
$stmt->debugDumpParams();
echo '</pre>';

return $stmt->errorInfo();
}

从 session 更新/登录脚本调用:

$where = array(
'id' => $user['id'],
);
$what = array(
'twitter_key' => $oauth_token,
'twitter_secret' => $oauth_token_secret
);

$update = $db->update('users', $where, $what);

类函数和调用者中的 echos 和 print_r 的输出:

// print_r($stmt = $this->dbh->prepare($query_str)) output:
PDOStatement Object
(
[queryString] => update users set `twitter_key` = ':twitter_key', `twitter_secret` = ':twitter_secret' where id = ':id' LIMIT 1;
)

// output from the bing params and execution returns
true :twitter_key=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
true :twitter_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
true :id 20
exec: true:1

// $stmt->debugDumpParams() output:
SQL: [111] update users set `twitter_key` = ':twitter_key', `twitter_secret` = ':twitter_secret' where id = ':id' LIMIT 1;
Params: 3
Key: Name: [12] :twitter_key
paramno=-1
name=[12] ":twitter_key"
is_param=1
param_type=2
Key: Name: [15] :twitter_secret
paramno=-1
name=[15] ":twitter_secret"
is_param=1
param_type=2
Key: Name: [3] :id
paramno=-1
name=[3] ":id"
is_param=1
param_type=2

// print_r($stmt->errorInfo()) output:
Array
(
[0] => 00000
)

最佳答案

我不太了解 PDO,但我的感觉是您绑定(bind)参数的方式有问题。但是,最简单的确定方法是查看实际查询。

根据docs ,您应该能够看到生成的查询,因为它转到 $stmt->queryString 中的 SQL。现在不可能看到,因为您将参数绑定(bind)到输出 $stmt 之后的语句。

在绑定(bind)参数后执行 print_r()(或者甚至可能在执行查询之后,我不知道)。您应该获得真正的查询字符串,并找到问题的根源。

关于PHP PDO 准备语句查询不更新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2124294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com