Как правильно использовать PDO

#php #mysql #database #pdo #sql-injection

#php #mysql #База данных #pdo #sql-инъекция

Вопрос:

Я пытаюсь работать с 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.

Комментарии:

1. попробуйте в таком порядке (и без кавычек :ip ): $DATA = $con->prepare("INSERT INTO users (ip) VALUES (:ip)"); $DATA->bindParam(':ip', $ip); $DATA->execute();

2. Похоже, не сработало @aldanux

3. и чем отличается мой код от echo_me?

Ответ №1:

вы должны указывать параметр binfd после запроса, а не до

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

некоторые ссылки

Комментарии:

1. Он по-прежнему работает без PDO::PARAM_STR , это PDO::PARAM_STR более безопасный способ? Также отличный и простой ответ

2. Я не уверен, прочитали ли вы вопрос в последнем комментарии. Он работает без PDO::PARAM_STR , PDO::PARAM_STR необходим>

3. @user302975 когда вы удаляете этот параметр, вы оставляете его на усмотрение PDO для определения типа данных ‘

4. не требуется, но явный тип данных для него не будет вставлен как другой тип.

5. таким образом, вы указываете тип данных .

Ответ №2:

Вы можете привязывать параметры только после подготовки запроса, иначе что вы привязываете?

 $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();
  

в этом случае оба будут работать.

Комментарии:

1. Когда я проверяю в БД, я получаю :ip в результате, а не фактическую сгенерированную строку…

2. @user302975 это потому, что у вас были кавычки вокруг него