【问题标题】:Prepared statement does not match bind variables even though it does?准备好的语句与绑定变量不匹配,即使它匹配?
【发布时间】:2017-06-11 04:29:49
【问题描述】:

据我所知,我从表中选择了 6 列,并绑定了 6 个变量,为什么它告诉我它不匹配?

这是一个评分脚本,人们可以在其中投票给汽车。

此脚本适用于插入/选择/联合,但我注意到当人们从文件夹结构中对图像进行投票时,一切都变得非常缓慢,因此我想将选定的图像移动到另一个文件夹,以便更快地访问它们,但是我在尝试绑定结果时似乎遇到了问题。这对我来说通常不是问题。

有人可以向我解释为什么在这种特殊情况下会发生这种情况吗?

更新:

我忘了包含类别变量 抱歉,它们是在刚刚定义的脚本中的真实脚本中......那么为什么所有的反对票?我告诉过你 SQL 的工作原理——我只是想改进它。

$cat1 = 1;
$cat2 = 2:
$cat3 = 3;
$stmt = $dbCon->prepare(" INSERT INTO cars_daily ( cars_daily_identifier, cars_daily_source, cars_daily_views, cars_daily_votes, cars_daily_rating, cars_daily_category) "
        . " (SELECT cars_car_id, cars_car_source, cars_car_views, cars_car_votes, cars_car_rating, cars_car_category "
        . " FROM cars_bcar "
        . " WHERE cars_car_category IN (?) ORDER BY RAND() LIMIT 5) "
        . " UNION "
        . " (SELECT cars_car_id, cars_car_source, cars_car_views, cars_car_votes, cars_car_rating, cars_car_category "
        . " FROM cars_car "
        . " WHERE cars_car_category IN (?) ORDER BY RAND() LIMIT 5) "
        . " UNION "
        . " (SELECT cars_car_id, cars_car_source, cars_car_views, cars_car_votes, cars_car_rating, cars_car_category "
        . " FROM cars_car "
        . " WHERE cars_car_category IN (?) ORDER BY RAND() LIMIT 5) ");
$stmt->bind_param('iii', $cat1, $cat2, $cat3);
if ($stmt->execute()) {
    echo "<br><br>";
    echo "Success SELECT/INSERT";
    echo "<br><br>";
} else {
    echo "<br><br>";
    print_r($stmt->error);
    echo "<br><br>";
    echo "Fail SELECT/INSERT";
}

        $stmt->bind_result($cars_car_id, $cars_cars_source, $cars_car_views, $cars_car_votes, $cars_car_rating, $cars_car_category);
        while ($stmt->fetch()) {

            copy("models/$cars_cars_source", "daily/$cars_cars_source");
        }

【问题讨论】:

  • 你有没有试过在 mysql 中运行这样的语句(例如使用 phpMyAdmin 或类似的工具)?如果是,返回了什么?
  • 每个值都需要一个占位符。 $cat1, $cat2, $cat3 是单个值吗?
  • 您还期望获取/绑定(_result)什么?
  • 为什么所有的反对票?是的,这个 sql 有效......它只是 fetch 没有,我不值得所有这些downvotes
  • 我有所有的 $cat 变量,我只是忘记在这个例子中包含它们,抱歉它们是在脚本中定义的。但是感谢这么多的反对票,我告诉你 sql 有效,我只是试图改进它并从选择查询中获取结果......

标签: php mysql mysqli prepared-statement


【解决方案1】:

原因

即使要插入的值来自 SELECT 语句,INSERT 查询也不会产生记录(就像 SELECT 那样)。

解决方案

一种选择是运行 INSERT 查询,然后运行单独的 SELECT 以获取插入的值。

$selectSQL = " (SELECT cars_car_id, cars_car_source, cars_car_views, cars_car_votes, cars_car_rating, cars_car_category "
    . " FROM cars_bcar "
    . " WHERE cars_car_category IN (?) ORDER BY RAND() LIMIT 5) "
    . " UNION "
    . " (SELECT cars_car_id, cars_car_source, cars_car_views, cars_car_votes, cars_car_rating, cars_car_category "
    . " FROM cars_car "
    . " WHERE cars_car_category IN (?) ORDER BY RAND() LIMIT 5) "
    . " UNION "
    . " (SELECT cars_car_id, cars_car_source, cars_car_views, cars_car_votes, cars_car_rating, cars_car_category "
    . " FROM cars_car "
    . " WHERE cars_car_category IN (?) ORDER BY RAND() LIMIT 5) ";
//run the INSERT statement
$stmt = $dbCon->prepare(" INSERT INTO cars_daily ( cars_daily_identifier, cars_daily_source, cars_daily_views, cars_daily_votes, cars_daily_rating, cars_daily_category) " . $selectSQL);
$stmt->bind_param('iii', $cat1, $cat2, $cat3);
if ($stmt->execute()) {
    echo "<br><br>";
    echo "Success SELECT/INSERT";
    echo "<br><br>";
} else {
    echo "<br><br>";
    print_r($stmt->error);
    echo "<br><br>";
    echo "Fail SELECT/INSERT";
}
$stmt->close(); //close the prepared statement
//run the SELECT statement
$stmt = $dbCon->prepare($selectSQL);
$stmt->bind_param('iii', $cat1, $cat2, $cat3);
$stmt->execute()
$stmt->bind_result($cars_car_id, $cars_cars_source, $cars_car_views, $cars_car_votes, $cars_car_rating, $cars_car_category);
    
    .

【讨论】:

  • 如果 $cat1$cat2$cat3 有超过 1 个值,这将无法按预期工作,如果它们是 1 个值,= 将比 in 更好。跨度>
  • 嗯......为什么你说这不会按预期工作? OP 似乎将每个都绑定为一个整数(给定 bind_param()...的第一个参数...
  • 如果我不能让它在一个查询中工作,这也是我的解决方案,无论如何,谢谢......得到了很多反对票......这是不值得的。
  • 我不太确定为什么所有的反对票,但如果我不得不猜测,也许其他人想看看输出到底是什么(例如任何错误消息、空白变量等)......跨度>
  • 如果$cat11,2,那么12需要独立绑定。占位符按值引用/转义。 , 会破坏 i 声明。
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 2017-10-17
  • 2014-01-06
  • 2023-03-26
  • 1970-01-01
  • 2014-03-07
相关资源
最近更新 更多