处理时mysql_query到pdo转换错误

时间:2016-09-18 07:30:23

标签: php pdo

我需要帮助将mysql_query转换为PDO。编辑列时,MySQL数据库不会更新。我试过翻译以下代码:

<?php
include("connect.php");
if($_GET['id'] and $_GET['data'])
{
  $id = $_GET['id'];
  $data = $_GET['data'];
  $key = $_GET['key'];
  if(mysql_query("update information set $key='$data' where id='$id'"))
    echo 'success';
  }
} 
?>

进入这个:

<?php
include("connect.php");

if(isset($_GET))    
{
    $id = $_GET['id'];
    $data = $_GET['data'];
    $key = $_GET['key'];
}

try {
    $pdo = new PDO( DSN, DB_USR, DB_PWD );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->query( "SET NAMES utf8" );
    $stmt = $pdo->prepare(
        "UPDATE information
        SET
        key=:data where id=:id"
    );
    $stmt->bindValue( ':id', $id, PDO::PARAM_INT );
    $stmt->bindValue( ':key', $data, PDO::PARAM_STR );
    $stmt->execute();

} catch (PDOException $e){
    var_dump($e->getMessage());
}
$pdo = null;

1 个答案:

答案 0 :(得分:0)

您在:key来电时使用了bindValue() :data。您还需要将$key放入查询中(您不能使用占位符作为列名,因此这需要变量替换)。

$stmt = $pdo->prepare(
    "UPDATE information
    SET
    $key = :data where id=:id"
);
$stmt->bindValue( ':id', $id, PDO::PARAM_INT );
$stmt->bindValue( ':data', $data, PDO::PARAM_STR );
$stmt->execute();

您应该在替换之前验证$key,以防止SQL注入。类似的东西:

$allowed_keys = array('col1', 'col2', 'col3');
if (!in_array($key, $allowed_keys)) {
    die("Bad key $key");
}