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

Php 使用插入值数组执行准备好的语句不起作用,php,mysql,xampp,Php,Mysql,Xampp,我正试图用一个准备好的语句,使用一个insert值数组,在我的数据库上用php取消SELECT。目前,我使用的是存储过程,我的代码如下所示: $user_id = $user["id_user_key"]; $is_active = 1; $stmt = $db->prepare("CALL spGetUserProducts(?, ?)"); $stmt->bind_param("ii", $user_id, $is_active); $stmt->execute(); $

我正试图用一个准备好的语句,使用一个insert值数组,在我的数据库上用php取消SELECT。目前,我使用的是存储过程,我的代码如下所示:

$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();
这很好,但目前我想摆脱我的存储过程,用php编写所有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 = :isActive
                AND tup.id_user_fk = :getUser"
);
$stmt->execute(array(
    ":getUser" => $user_id,
    ":isActive" => $is_active)
);
$result = $stmt->get_result();
运行此脚本时,出现以下错误:

未捕获的mysqli\u sql\u异常:您的sql语法有错误;检查与您的MySQL服务器版本对应的手册,以了解第12行附近使用的正确语法:isActive和tup.id\u user\u fk=:getUser

可以肯定的是,我也确实在不绑定参数的情况下运行了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();
这也行得通。虽然我在php.net中遵循了以下示例,但是:getUser和:isActive的绑定似乎不起作用:

/* 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));
我正在运行XAMPP3.2.2


对此有何想法?

您似乎正在使用mysqli\uuphp代码库连接到数据库。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();

看起来您试图使用PDO在mysqli应用程序中使用命名参数的功能。mysqli_uu不支持PDO那样的命名占位符。使用PDO连接/查询方法,还是使用?作为占位符。@Qirel实际上错过了这一位。未捕获的mysqli\u sql\u异常,所以现在根本没有任何假设。我将删除我的愚蠢问题:@NigelRen。我真的很糟糕。谢谢你指出这一点!这让我大开眼界!我不知道mysqli不支持命名参数。我的错。我不想切换到PDO,因为mysqli要快得多。谢谢你的解释!没问题。mysqli文档在任何地方都没有提到命名参数。我猜你看错PDO文件了。读起来可能很有趣。谢谢。非常有用!