如何正确使用PDO

问题描述 投票:0回答:2

我正在尝试使用PDO来使我的脚本更安全。我有一个演示,所以我将变量设置为这个$STH->bindParam(':ip', $ip);,然后像这样调用它

$DATA = $con->prepare("INSERT INTO users (ip) VALUES (':ip')");

问题是由于某种原因它没有进入数据库。这是我的完整代码:

<?php
$host = "localhost";
$dbname = "users";
$user = "root";
$pass = "root";


try{
    $con = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);    
}
catch(PDOException $e){
    echo $e->getMessage();
}

function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}



$ip = generateRandomString().sha1($_SERVER['SERVER_ADDR']).generateRandomString();


$STH->bindParam(':ip', $ip);

$DATA = $con->prepare("INSERT INTO users (ip) VALUES (':ip')");
$DATA->execute();

?>

是的,我明白这不是如何让IP成为第四,我只是在玩PDO和MYSQL。

php mysql database pdo sql-injection
2个回答
0
投票

你必须在查询之后绑定参数而不是之前

 $DATA = $con->prepare("INSERT INTO users (ip) VALUES ( :ip )");
 $DATA->bindValue(':ip', $ip , PDO::PARAM_STR); // if ip column is string
 $DATA->execute();

some ref


0
投票

您只能在准备查询后绑定参数,否则绑定的是什么?

$ip= generateRandomString().sha1($_SERVER['SERVER_ADDR']).generateRandomString();
$stmt= $con->prepare("INSERT INTO users (ip) VALUES (:ip)");
$stmt->bindParam(':ip', $ip);
$stmt->execute();

bindValue不同,bindParam允许您在变量初始化之前或之后绑定,因为它使用变量引用而不是值,因此您可以在绑定后放置create $ip

$stmt= $con->prepare("INSERT INTO users (ip) VALUES (:ip)");
$stmt->bindParam(':ip', $ip);
$ip= generateRandomString().sha1($_SERVER['SERVER_ADDR']).generateRandomString();
$stmt->execute();

两者都适用于这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.