gpt4 book ai didi

php - 在 PDO SQL 语句中使用 PHP 变量时出现问题

转载 作者:行者123 更新时间:2023-11-29 08:08:25 25 4
gpt4 key购买 nike

好的,所以我需要一个解决方法或一些新的方向,以及我尝试通过 PHP 运行此查询的方式。

基本上,当且仅当 API 字符串传递该列的字符串时,我才想更新列。因此,如果用户更新名称,但没有其他任何内容,那么它只会更新表中的名称列。这解释了查询...现在讨论这个问题。

问题是为了比较发送的 API 参数是否为空或实际包含内容(这是一个 iPhone 应用程序),我必须将 PHP 变量插入到 SQL 语句中并说,如果这是空白则使用表的预先存在的值... SQL 中的这种直接变量使用显然会导致错误。例如,如果密码或变量名称中包含“或”的任何内容,那么它会破坏整个查询,因为该变量在 SQL 中插入撇号并搞砸了语句。据我所知,没有办法转义它如果我使用 PDO quote(),它会在数据库列中插入引号,但我不希望这样!有更好的方法来完成我想做的事情吗?请告知。我愿意完全重做我的语句,并且我不喜欢我所拥有的,因为我认为这对于 SQL 服务器来说是非常耗费人力的。

 //Assign passed parameters
$usr_id = $the_request['user_id'];
$usr_name = $the_request['name'];
$usr_email = $the_request['email'];//needs to re-validate
$usr_pass = $the_request['password'];//rehash
$usr_phone = $the_request['phone'];
$usr_img = $the_request['user_img'];

$queryUpdate = "UPDATE TABLE SET name = CASE WHEN '$usr_name' = '' THEN name ELSE ? END,
email = CASE WHEN '$usr_email' = '' THEN email ELSE ? END,
password = CASE WHEN '$usr_pass' = '' THEN password ELSE ? END,
phone = CASE WHEN '$usr_phone' = '' THEN phone ELSE ? END,
user_img = CASE WHEN '$usr_img' = '' THEN usr_img ELSE ? END
WHERE id = ? LIMIT 1";

if ($stmtUpdate = $dbh->prepare($queryUpdate)) {
$stmtUpdate->execute(array($usr_name,$usr_email,$hash,$usr_phone,$usr_img,$id));
if( $stmtUpdate->rowCount() == 1 ) {
echo json_encode(array('error' => ''));
} else {
echo json_encode(array('error' => 'Profile left unaffected'));
}
}

最佳答案

为什么不根据需要构建查询,例如

if (!isset($the_request['user_id'])) {
throw new RuntimeException('Required request param "user_id" not found');
}

// Filter request using array of allowed keys
$params = array_intersect_key($the_request, array_flip(['name', 'email', 'password', 'phone', 'user_img']));

// Remove any empty values
$params = array_filter($params);

if (!count($params)) {
exit; // or throw an exception, just end the program here though
}

// Build an array of SET parameters
$set = array_map(function($key) {
return sprintf('%s = :%s', $key, $key);
}, array_keys($params));

$params['id'] = $the_request['user_id'];

$sql = sprintf('UPDATE TABLE SET %s WHERE id = :id LIMIT 1', implode(', ', $set));
$stmt = $dbh->prepare($sql);
$stmt->execute($params);

此处演示 - http://ideone.com/jQ9etj

关于php - 在 PDO SQL 语句中使用 PHP 变量时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238923/

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