使用插入值数组执行预准备语句不起作用

问题描述 投票:2回答:1

我正在尝试使用插入值数组,使用预准备语句在我的数据库中使用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做所有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();

当我运行此脚本时,我收到以下错误:

未捕获的mysqli_sql_exception:您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在第12行附近使用正确的语法:'isActive AND tup.id_user_fk =:getUser'

可以肯定的是,我也运行了我的SQL脚本而没有绑定params,如下所示:

$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上运行。

有什么想法吗?

php mysql xampp
1个回答
5
投票

您似乎正在使用mysqli_ PHP代码库连接到您的数据库。 MySQLi不支持命名参数。你没有确切地说你从哪里得到你的例子,但我猜它是来自与PDO图书馆有关的页面。它们是不同的库,具有不同的(尽管看起来相似,如果你没有仔细检查)功能名称和功能。

但是,没有什么可以阻止您继续使用支持的语法。您只需切换提供参数的顺序,以匹配它们在SQL中出现的顺序。 (或者当然,您可以在SQL中切换WHERE子句的顺序,但在这里我已经切换了参数值的顺序。)

$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();
© www.soinside.com 2019 - 2024. All rights reserved.