Как передать несколько переменных условия where в bind_param? - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь сделать несколько запросов, используя подготовленные операторы. Я получаю количество ошибок связывания параметров:

Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\wamp\www\c\index.php on line 35

Строка 35:

$stmt->bind_param('i', $user_id);

Вот общие коды: Я попробовал несколько примеров, но не смог заставить его работать.

Пример 1: $stmt->bind_param('i', $id); // выводим идентификатор из сессии Пример 2:

$stmt->bind_param('ii',$id, $user_id);

И еще несколько попыток.

$id = $_SESSION['id']; // значение приходит из сеанса и его полное значение

$stmt = $mysqli->prepare("SELECT users.*, stores.*, products.* FROM stores, products, users WHERE users.id = ? AND stores.user_id = ? AND products.user_id = ?");
$stmt->bind_param('i', $user_id);
$stmt->execute();
$stmt->bind_result($id, $user_id, $pname);
$stmt->fetch();
$stmt->close();
echo $pname;

Когда я делаю запросы в кодах phpmyadmin, он отлично работает на $ sql следующим образом:

$sql = "SELECT users.*, stores.*, products.*\n"

    . "FROM stores, products, users\n"

    . "WHERE ((users.id) AND (stores.user_id) AND (products.user_id))";

И без php-кода

SELECT users.*, stores.*, products.* 
FROM stores, products, users 
WHERE ((users.id) 
AND (stores.user_id) 
AND (products.user_id))

Это ближайший пример: У меня ошибка:

Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement in C:\wamp\www\c\index.php on line 37

Строка 37:

$stmt->bind_result($user_id, $username, $pname);

$id = $_SESSION['id'];

Ближайший код:

$stmt = $mysqli->prepare("SELECT users.*, stores.*, products.* FROM stores, products, users WHERE users.id = stores.user_id AND stores.user_id = products.user_id AND products.user_id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($user_id, $username, $pname);
$stmt->fetch();
$stmt->close();
echo $pname;

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вот рабочий пример кода, который мне пришлось изменить:

SELECT users.*, stores.*, products.* FROM

К

SELECT users.id, users.username, stores.user_id, stores.name, products.user_id, products.pname FROM

А остальная часть кода выглядит так: и теперь он работает, я хотел бы знать, безопасно ли его использовать на живом и динамичном веб-сайте?

Может кто-нибудь исправить код, пожалуйста. Вот полный рабочий код

    $id = $_SESSION['UserId'];
    $stmt = $mysqli->prepare("SELECT users.id, users.username, stores.user_id, stores.name, products.user_id, products.pname 
     FROM stores, products, users 
     WHERE users.id = ? 
     AND stores.user_id = users.id 
     AND products.user_id = users.id");
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $stmt->bind_result($id, $username, $user_id, $name, $user_id, $pname);
    $stmt->fetch();
    $stmt->close();
    echo $pname;

    echo"<br>" .$name;

    echo "<br>".$username;

Я пробовал ВНУТРЕННЕЕ СОЕДИНЕНИЕ И ЛЕВОЕ СОЕДИНЕНИЕ (упоминается в комментарии), но не смог сделать и то, и другое. работа

EDİT :

Тот же запрос с INNER JOIN работает.

$sid = $_SESSION['UserId'];
$stmt = $mysqli->prepare("SELECT u.id, u.username, s.user_id, s.name, p.user_id, p.pname FROM stores AS s INNER JOIN products AS p ON p.store_id = s.store_id INNER JOIN users AS u ON u.id = p.user_id WHERE s.user_id = ?");
$stmt->bind_param('i', $sid);
$stmt->execute();
$stmt->bind_result($id, $username, $user_id, $name, $user_id, $pname);
$stmt->fetch();
$stmt->close();
echo $pname;

echo"<br>" .$name;

echo "<br>".$username;
0 голосов
/ 06 мая 2018

Ваше подготовленное утверждение содержит 3 вопросительных знака / заполнителя. Таким образом, вы должны связать ровно 3 значения.

Я думаю, что это должно работать:

$stmt = $mysqli->prepare("SELECT users.*, stores.*, products.* FROM stores, products, users WHERE users.id = ? AND stores.user_id = ? AND products.user_id = ?");
$stmt->bind_param('iii', $user_id, $user_id, $user_id);

См. Примеры по адресу: http://php.net/manual/de/mysqli-stmt.bind-param.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...