使用PDO避免SQL注入 - 新手

时间:2014-04-17 09:15:17

标签: php sql pdo sql-injection

我正在尝试使用PDO来避免sql注入,并一直在寻找和搜索示例,这就是我想出来的,但某处有某种错误。数据库没有得到更新,我得到和SQL错误,但它不会打印详细信息。

elseif (isset($_POST["bilnr"])) {

        $name = $_POST['name']; $mobil = $_POST['mobil']; $bilnr = $_POST['bilnr']; $regnr = $_POST['regnr']; $userid = $_COOKIE[userid]; $username = $_COOKIE[user]; 

        $sql=$oDB->Prepare("UPDATE members SET name=:name, mobil=:mobil, bilnr=:bilnr, regnr=:regnr WHERE id=:userid AND username=:username");
        $sql->execute(array(':userid' => $userid);

    if (!$sql) {
        echo "\nPDO::errorInfo():\n";
        print_r($oDB->errorInfo());
    }   

    echo "<p class=\"red\">Informasjonen er oppdatert!</p>";
    mysqli_close($con); } 

如果或当我删除mysqli_close字符串时,某些内容会崩溃并且页面只会变为空白而没有错误。另外,使用上面的代码,表单中的更新不会进入数据库。

和PDO连接在一个单独的文件中包含

$oDB=new PDO("mysql:host=$host;dbname=$db_name", $username, $password);

这是更新后的代码

elseif (isset($_POST["bilnr"])) {

        $name = $_POST['name']; $mobil = $_POST['mobil']; $bilnr = $_POST['bilnr']; $regnr = $_POST['regnr']; $userid = $_COOKIE[userid]; $username = $_COOKIE[user]; 

        $sql=$oDB->Prepare("UPDATE members SET name=:name, mobil=:mobil, bilnr=:bilnr, regnr=:regnr WHERE id=:userid AND username=:username");
        $sql->execute(array(':userid' => $userid,
                    ':name' => $name,
                    ':mobile' => $mobile,
                    ':bilnr' => $billnr,
                    ':regnr' => $regnr,
                    ':username' => $username));

        if (!$sql) {
            echo "\nPDO::errorInfo():\n";
            print_r($oDB->errorInfo());
        }       

    echo "<p class=\"red\">Update Done!</p>";
    mysqli_close($con); } 

下一个问题是将值输入数据库,因为现在我没有收到任何错误,所以我不确定是什么错误。

更新

它有效,只是数组变量中的一些错字:)

3 个答案:

答案 0 :(得分:0)

mysqli_query的第一个参数必须是一个字符串(表示SQL查询),但是您正在向它传递一个PDO准备好的查询。

不要混合和匹配多个数据库库。

使用PDO mysqli_

答案 1 :(得分:0)

首先,您无法混合mysqliPDO。其次,您的查询问题在于您有6个占位符,但在致电execute()时,您只需填写其中一个占位符。它应该是:

$sql->execute(array(':userid' => $userid,
                    ':name' => $name,
                    ':mobile' => $mobile,
                    ':bilnr' => $billnr,
                    ':regnr' => $regnr,
                    ':username' => $username));

答案 2 :(得分:-1)

你不再需要mysqli_ *函数,废弃它们(仅当你使用PDO时):)当你使用PDO时,mysql_ *和mysqli_ *在组合时不起作用。我建议你再使用PDO而不是mysql函数。 PDO现已成熟,是首选方式。

$sql = " 
    INSERT INTO table (name) 
    VALUES (:name) 
    "; 

//Here you prepare the SQL (you already did that correctly).
$stmt = $db->prepare($sql); 

//You can choose to use bindParam, bindValue or include it in the array (as you do it).
$stmt->bindParam(':name', $name, PDO::PARAM_STR); 

$name = 'John'; 
$stmt->execute();

这是示例如何使用PDO将内容插入MySQL数据库。