Использование PDO, чтобы избежать внедрения SQL - новый код не работает (новичок)

Я хочу использовать подготовленные операторы, чтобы избежать внедрения SQL.

Чтобы дать вам представление, это был мой старый код:

<?php
    (connect to database = ok)

    $id = str_replace ('-', ' ', $_GET['id']);

    $sql = "SELECT * FROM `table-news` WHERE `id` = '$id' ORDER BY `date` DESC";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
?>

<div id="content">
    <?php echo strtolower($row['text']);?>
</div>

<?php
    }// end while
    }// end if
    else {
    echo '0 results';
    }// end else
?>

И это новый код:

<?php
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');               
    $id = str_replace ('-', ' ', $_GET['id']);                  
    $sql = "SELECT id, title, year, date, text FROM `table-news` WHERE id= :id ORDER BY `date` DESC";

    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(":id", $id);
    $stmt->execute();

    if($result = $stmt->fetch(PDO::FETCH_ASSOC))
    {
?>

<div id="content">
    <?php echo strtolower($result['text']);?>
</div>

<?php
}// end if
else {
echo '0 results';
}// end else
?>

Я получил (по крайней мере) одну проблему с этим новым кодом:

Приведенный ниже код не избегает SQL-инъекций. Как я могу преобразовать это в безопасный код, используя PDO? (Мне действительно нужно заменить все пробелы дефисом)

`$id = str_replace ('-', ' ', $_GET['id']);`

3 ответа

Замени это

$stmt->bindParam(":id", $_GET['id']);

с

$stmt->bindParam(":id", $id);

Ваш код выглядит хорошо, не уверен, почему вы думаете, что он не избегает инъекций

Просто избавьтесь от следующей строки:

$id = str_replace ('-', ' ', $_GET['id']); 

Вам не нужно вручную чистить параметры. В этом весь смысл подготовки запроса.

$id = $_GET['id'];      

$sql = "SELECT id, title, year, date, text FROM `table-news` 
        WHERE id= :id ORDER BY `date` DESC";

$stmt = $pdo->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->execute();

Если вы беспокоитесь о гипсе, то придерживайтесь линии, но отдельный гипс не так опасен, как двойной гипс --словно SQL Комментарии.

Чтобы сменить нижеследующее на mysqli подготовлено, посмотрите это...

  $sql = "SELECT * FROM `table-news` WHERE `id` = '$id' ORDER BY `date` DESC";
  $result = $conn->query($sql);

Для того, чтобы..

//create db connection
  $conn = new mysqli("localhost", "my_user", "my_password", "world");

//create prepared statement
  $statement = $conn->prepare("SELECT * FROM `table-news` WHERE `id` = ? ORDER BY `date` DESC");

//bind parameters
  $statement->bind_param('s', $id);

//execute query
  $statement->execute();

Читайте дальше об этих компонентах, если вы не понимаете некоторые биты. Один бит они могут выглядеть странно bind_param 's' значение Это говорит MySQL, что параметр является строкой. Допустим, у вас в подготовленном утверждении было два символа "?". Сначала было целое число, а во-вторых - строка, на которую это было бы похоже..

 $statement->bind_param('is', $MyInteger, $MyString);
Другие вопросы по тегам