在PDO SQL语句中使用PHP变量时遇到问题

时间:2014-03-07 00:11:44

标签: php mysql pdo

好的,所以我需要一个解决方法或一些新的方向,我试图通过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'));
        }
}

1 个答案:

答案 0 :(得分:2)

为什么不按要求建立查询,例如

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