php подготовил заявление (INSERT не работает) - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь использовать подготовленный stmt, чтобы избежать инъекций sql, и он не работает. Я окружил свой код некоторыми предупреждениями, чтобы знать, где проблема. Это в заявлении bind_param. Все после никогда не выполняется. Надеюсь, я смогу помочь!

Последние 3 часа искали ответ, но пока ничего не решили. П.С таблица имеет 6 столбцов. один идентификатор, который автоматически увеличивается, а остальное, как вы можете видеть из кода

$db = new PDO("mysql:port=3302;dbname=thedoctors", "root", ""); 
$Data = $_POST["post"];
$postData = $db->quote($_POST["post"]); //user's post
$user = $db->quote($_SESSION["user"]);    //user's email
$stmt = $db->prepare("INSERT INTO post (body,timee,likes,comments,userem) VALUES (?, NOW(), ?, ?, ?);");

// set parameters and execute

$first = ".$postData.";
$like = 0;
$comment = 0;

$stmt->bind_param("siis", $first, $like, $comment, $user);
echo "<script>alert('hello');</script>";
// $result = $stmt->get_result();
// header("location:activity.php");
if (strlen($Data) > 3000 || strlen($Data) < 1) {
    echo "<script>alert('Make sure your post is of correct length!');</script>";
} else {
    $stmt->execute();
    echo "<script>alert('Post uploaded! You can check it in your profile!');</script>";
}

1 Ответ

1 голос
/ 28 апреля 2019

Поскольку вы используете PDO, а не mysqli интерфейс, вам нужно использовать именованные параметры в запросе SQL, как показано здесь: https://www.php.net/manual/en/pdo.prepare.php

В настоящее время вы полагаетесь на bind_param, который является методом дляИнтерфейс mysqli.

На основе документов PDO:

<?php
/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();
?>

Кроме того, я бы рекомендовал использовать bindValue , чтобы сделать более явным то, что вы устанавливаете некоторые значения для заполнителей, таких какэто:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...