nasko bobev Ответов: 2

Php warning: mysqli_stmt::bind_param(): количество элементов в строке определения типа не соответствует количеству переменных привязки warning


Я испытываю следующую ошибку.

Предупреждение: mysqli_stmt::bind_param(): количество элементов в строке определения типа не соответствует количеству переменных привязки

Как исправить эту проблему?

Authenticate.php
<?php
require_once "config.php";
session_start(); // Starting Session
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
echo $_POST['username'];
echo $_POST['password'];
$error = ''; // Variable To Store Error Message
    echo "Submit clicked";
if (empty($_POST['username']) || empty($_POST['password'])) {
echo "Username or Password is invalid";
    echo "Still haven't got data";
}else{

$username = $_POST['username'];
$password = $_POST['password'];
$conn = $link;
$query = "SELECT username, password, data FROM mathbglogin WHERE username = '$username' and password = '$password'";
$stmt = $conn->prepare($query);
$stmt->bind_param("sss", $username, $password, $data);
$stmt->execute();
$stmt->bind_result($username, $password, $data);
$stmt->store_result();
if($stmt->fetch()){
$_SESSION['username'] = $username;
$_SESSION['data'] = $data;
    echo $username, $data;
header("location: welcome.php");
mysqli_close($conn); 
    echo "Done!";
}else{
    echo "Unsuccessful";
}
}

?>


config.php

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_NAME', 'users');
 $link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
 if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
?>

То, что я получаю, это:

123321Submit щелкнул
Предупреждение: mysqli_stmt::bind_param(): количество элементов в строке определения типа не соответствует количеству переменных привязки в строке определения типа. D:\Apps\XAMPP\htdocs\StefanMath - Copy\LoginAuthenticate.php на линии 22
Неудачный



Имейте в виду, что 123321-это фиктивный тест и пароль.

Что я уже пробовал:

Я пытался изменить количество утверждений, но это не работает.

2 Ответов

Рейтинг:
2

Patrice T

$query = "SELECT username, password, data FROM mathbglogin WHERE username = '$username' and password = '$password'";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
0

Richard MacCutchan

Наиболее вероятная причина заключается в том, что поле $data пусто, как показано в сообщении, которое вы эхом повторяете в строке 13. Поэтому сделайте то, что уже предложил Патрис Т, и создайте правильный SQL-оператор, который не будет уязвим для SQL-инъекций. Создайте правильный хэшированный пароль вместо того, чтобы хранить его в открытом тексте, и удалите ссылку на $data в инструкции bind.