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

Я пытаюсь использовать mysqli :: bind_param неудачно. В коде, ниже, функция login ( ) называется с username а также password на странице login.php , Несмотря на все усилия и прочитанные руководства и форумы, продолжает возвращаться та же ошибка.

Я пробовал оба с

bind_param ( 's' , $ variable )

что с

bind_param ( 1 , $ variable )

что с

bind_param ( 'ss' , $ variable1 , $ variable2 )

и я попробовал запрос без »

"SELECT id,org_id,org_group_id,people_id FROM users WHERE username = ? AND password = ?"

Где я не прав?

public function login($_username, $_password) {
$this->sessionOpen ();

if ($_username == "") {
$this->log->error ( "Username vuoto" );
throw new AuthLoginFailed ();
}
if ($_password == "") {
$this->log->error ( "Password vuota" );
throw new AuthLoginFailed ();
}

$db = new mysqli ( $this->sql ['server'], $this->sql ['username'], $this->sql ['password'], $this->sql ['database'] );
if (mysqli_connect_errno ()) {
$this->log->error ( "Errore di connessione a mysql: " . mysqli_error ( $db ) );
throw new MysqliConnectionError ( "Mysqli error: " . mysqli_error ( $db ) );
}

$stmt = $db->prepare ( "SELECT id,org_id,org_group_id,people_id FROM users WHERE 'username' = ? AND 'password' = ?" );
if (! $stmt) {
$this->log->error ( "Mysqli prepare error: " . mysqli_error ( $db ) );
throw new MysqliPrepareException ( "Mysqli error: " . mysqli_error ( $db ) );
}
echo md5 ( $_username ) . "---" . md5 ( $_password );
//on page username and password is showed at this point
$user=trim(md5 ( $_username ));
$pass=trim(md5 ( $_password ));
$stmt->bind_param ( 1,  $user);
$stmt->bind_param ( 2,  $pass);
/* Execute it */
$stmt->execute ();
if (! $stmt) {
$this->log->error ( "Mysqli prepare error: " . mysqli_error ( $db ) );
throw new MysqliExecuteException ( "Mysqli error: " . mysqli_error ( $db ) );
}


$stmt->fetch($rst);

echo "results: " . $rst->num_rows; //output of this: results:

if ($rst->num_rows == 0) {
throw new AuthLoginFailed ();
}



/* Close statement */
$stmt->close ();

/* Close connection */
$db->close ();
}

Ошибка в журнале apache есть

[Sat Oct 24 08:52:04 2015] [error] [client 192.168.253.6] PHP Warning:  mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /www/gexy/XXXX/html/lib/Auth.php on line 77, referer: https://gexy.it/login.php
[Sat Oct 24 08:52:04 2015] [error] [client 192.168.253.6] PHP Warning:  mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in /www/gexy/XXXX/html/lib/Auth.php on line 78, referer: https://gexy.it/login.php

Большое спасибо всем

0

Решение

Модификация это:

$ stmt-> bind_param («ss», $ user, $ pass);
потому что 1 тип данных не определен в bind_param (). bind_param () будет принимать два аргумента. Первый — это типы (i, d, s, b), соответствующий тип данных в вашем запросе (?), а второй аргумент — значения.

Предложения являются:

  1. Не сравнивайте с == для пустой строки, потому что если пользователь введет 3 пробела, он не будет равен. используйте empty () для проверки пустой строки или нет.

  2. Не вызывайте ненужных методов, это не имеет никакого значения, например: в вашем коде ваше обращение trim() после md5(), md5() не вернет ни одного символа пробела. Так зовет trim(md5($username)) значит меньше.

Попробуйте заменить ваш код моим кодом, надеюсь, ваша проблема решена.

public function login($_username, $_password) {
$this->sessionOpen ();

if (empty($_username)) {
$this->log->error ( "Username vuoto" );
throw new AuthLoginFailed ();
}
if (empty($_password)) {
$this->log->error ( "Password vuota" );
throw new AuthLoginFailed ();
}

$db = new mysqli ( $this->sql ['server'], $this->sql ['username'], $this->sql ['password'], $this->sql ['database'] );
if (mysqli_connect_errno ()) {
$this->log->error ( "Errore di connessione a mysql: " . mysqli_error ( $db ) );
throw new MysqliConnectionError ( "Mysqli error: " . mysqli_error ( $db ) );
}

$stmt = $db->prepare ( "SELECT id,org_id,org_group_id,people_id FROM users WHERE 'username' = ? AND 'password' = ?" );
if (! $stmt) {
$this->log->error ( "Mysqli prepare error: " . mysqli_error ( $db ) );
throw new MysqliPrepareException ( "Mysqli error: " . mysqli_error ( $db ) );
}
echo md5 ( $_username ) . "---" . md5 ( $_password );
//on page username and password is showed at this point
$user=md5 ( $_username );
$pass=md5 ( $_password );
$stmt->bind_param ( "ss",  $user,$pass);
/* Execute it */
$stmt->execute ();
if (! $stmt) {
$this->log->error ( "Mysqli prepare error: " . mysqli_error ( $db ) );
throw new MysqliExecuteException ( "Mysqli error: " . mysqli_error ( $db ) );
}


$stmt->fetch($rst);

echo "results: " . $rst->num_rows; //output of this: results:

if ($rst->num_rows == 0) {
throw new AuthLoginFailed ();
}



/* Close statement */
$stmt->close ();

/* Close connection */
$db->close ();
}

Дайте мне знать, как только ваша проблема будет решена.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector