将弃用的PHP SQL命令转换为PDO

时间:2014-03-01 13:42:55

标签: php mysql sql pdo

最近查看了一些旧文件并意识到它们现在已被弃用。我已经尝试将它们转换为更新的PDO变体,但我坚持不懈。这是代码:

<?php
$team=$_POST['team'];
$user=$_POST['user'];
$dbHandle=new PDO("mysql:host=localhost;dbname=databasename;","user","password",array(PDO::ATTR_EMULATE_PREPARES=>false));
$query=$dbHandle->prepare("INSERT INTO tablename VALUES(?,?,?)");
if(!is_numeric($user)){
    echo "Error message 1";
}elseif($user=="123"){
    echo "Error message 2";
}else{
    $query->execute(array($user,$team,"pending"));
    if(mysql_affected_rows()>0){
        echo "Success message";
    }else{
        echo "Error message 3";
    }
}
?>

我尝试过的任何东西似乎都没有得到成功的消息。看起来大多数代码都在工作,因为它总是每次都给我第三条错误消息,我可以确认没有任何内容添加到数据库中。上面没有显示用于启用所有PHP错误消息的三行代码,但页面没有丢弃任何此类消息。

另外,虽然我很喜欢PDO,但是从我理解的方式来看,它更加安全。从我上面的内容来看,是否有任何安全风险,如果有,我该如何解决?

编辑:代码目前如此:

<?php
    $team=$_POST['team'];
    $user=$_POST['user'];
    $dbHandle=new PDO("mysql:host=localhost;dbname=databasename;","user","password",array(PDO::ATTR_EMULATE_PREPARES=>false));
    $query=$dbHandle->prepare("INSERT INTO tablename VALUES(?,?,?)");
    if(!is_numeric($user)){
        echo "Error message 1";
    }elseif($user=="123"){
        echo "Error message 2";
    }else{
        $query->execute(array($user,$team,"pending"));
        if($query->rowCount()>0){
            echo "Success message";
        }else{
            echo "Error message 3";
        }
    }
?>

2 个答案:

答案 0 :(得分:1)

问题是mysql_affected_rows()函数不是PDO ,您应该使用->rowCount()方法来了解受影响行的值。另外,我会在一个单独的指令中添加参数,指定正确的类型,如PDO::PARAM_INTPDO::PARAM_STR这样的常量,这样可以避免错误:

$query=$dbHandle->prepare("INSERT INTO tablename VALUES(?,?,?)");
if(!is_numeric($user)){
    echo "Error message 1";
}elseif($user=="123"){
    echo "Error message 2";
}else{ 
    $status = "pending";
    $query->bindParam(1, $user, PDO::PARAM_INT);
    $query->bindParam(2, $team, PDO::PARAM_STR);
    $query->bindParam(3, $status, PDO::PARAM_STR);
    $query->execute();
    if($query->rowCount() > 0){
        echo "Success message";
    }else{
        echo "Error message 3";
    }
}

答案 1 :(得分:1)

<?php
ini_set('display_errors',1);
error_reporting(E_ALL);

$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,"user","password", $opt);
$stm = $pdo->prepare("INSERT INTO tablename VALUES(?,?,?)");
$stm->execute(array($_POST['user'],$_POST['team'],"pending"));
echo "Success message";