выполнение подготовленного оператора с массивом значений вставки не работает - PullRequest
2 голосов
/ 13 марта 2019

Я пытаюсь определить SELECT в php в моей базе данных с подготовленным оператором, используя массив значений вставки.На данный момент я работаю с хранимыми процедурами, и мой код выглядит следующим образом:

$user_id = $user["id_user_key"];
$is_active = 1;

$stmt = $db->prepare("CALL spGetUserProducts(?, ?)");
$stmt->bind_param("ii", $user_id, $is_active);
$stmt->execute();
$result = $stmt->get_result();

Это работает нормально, но на данный момент я хотел бы избавиться от своих хранимых процедур и сделать все SQL in php

Я изменил приведенный выше код на это:

$user_id = $user["id_user_key"];
$is_active = 1;

$stmt = $db->prepare(
           "SELECT
                tp.id_product AS id,
                tp.product_name AS pname,
                tp.product_code AS pcode,
                tp.product_icon AS picon
            FROM
                tbl_user_products tup
            INNER JOIN
                tbl_products tp
                ON tp.id_product = tup.id_product_fk
            WHERE
                tup.active = :isActive
                AND tup.id_user_fk = :getUser"
);
$stmt->execute(array(
    ":getUser" => $user_id,
    ":isActive" => $is_active)
);
$result = $stmt->get_result();

Когда я запускаю этот скрипт, я получаю следующую ошибку:

Uncaught mysqli_sql_exception: у вас естьошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с ': isActive AND tup.id_user_fk =: getUser' в строке 12

Чтобы быть уверенным, я также запустил свой SQLскрипт без привязки параметров, вот так:

$user_id = $user["id_user_key"];
$is_active = 1;

$stmt = $db->prepare(
          "SELECT
                tp.id_product AS id,
                tp.product_name AS pname,
                tp.product_code AS pcode,
                tp.product_icon AS picon
            FROM
                tbl_user_products tup
            INNER JOIN
                tbl_products tp
                ON tp.id_product = tup.id_product_fk
            WHERE
                tup.active = 1
                AND tup.id_user_fk = 1"
);
$stmt->execute();
$result = $stmt->get_result();

И это тоже работает.Кажется, что связывание :getUser и :isActive не работает, хотя я последовал этому примеру с php.net:

/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->execute(array(':calories' => $calories, ':colour' => $colour));

Я запускаю вещи на XAMPP 3.2.2.

Есть мысли по этому поводу?

1 Ответ

5 голосов
/ 13 марта 2019

Похоже, вы используете библиотеку PHP * mysqli_ для подключения к вашей базе данных. MySQLi не поддерживает именованные параметры. Вы не сказали точно, откуда вы взяли свой пример, но я предполагаю, что это было на странице, относящейся к библиотеке PDO. Это разные библиотеки с разными (хотя и похожими, если не проверять достаточно) именами и возможностями функций.

Однако ничто не мешает вам продолжать использовать поддерживаемый синтаксис. Вам просто нужно изменить порядок, в котором вы предоставляете параметры, чтобы они соответствовали порядку их появления в SQL. (Или, конечно, вы можете изменить порядок предложений WHERE в SQL, но здесь я изменил порядок значений параметров.)

$stmt = $db->prepare(
           "SELECT
                tp.id_product AS id,
                tp.product_name AS pname,
                tp.product_code AS pcode,
                tp.product_icon AS picon
            FROM
                tbl_user_products tup
            INNER JOIN
                tbl_products tp
                ON tp.id_product = tup.id_product_fk
            WHERE
                tup.active = ?
                AND tup.id_user_fk = ?"
);

$stmt->bind_param("ii", $is_active, $user_id);
$stmt->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...