PHP 预准备语句未插入,未出现错误

PHP Prepared Statement not inserting, no errors appearing

提问人:Wil 提问时间:1/11/2023 最后编辑:Paul T.Wil 更新时间:9/8/2023 访问量:226

问:

我正在尝试通过PHP中的预处理语句插入一些数据。我有以下代码没有为我插入。我还设置了以下代码

ini_set('display_errors', 1);

error_reporting(~0);

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

try {
    $sqlInsert = "INSERT INTO deck_cards (deckid, cardid, qty) VALUES (?,?,?)";
    $stmtInsert = $conn->prepare($sqlInsert);
    
    if ($stmtInsert)
    {
        $stmtInsert->bind_param("sss", $deckid, $cardid, $cardcount) or trigger_error($stmtInsert->error, E_USER_ERROR);
        $stmtInsert->execute() or trigger_error($stmtInsert->error, E_USER_ERROR);
        echo "Check if this ran";
    }
    else {
        echo "Error: " . $sql . "<br>" . $conn->error;
        $conn->close();
    }

    $stmtInsert->close();
}
catch (Exception $ex)
{
    echo 'Exception occurred '.$ex->getTraceAsString();
}

执行此操作时,我确实看到文本“检查它是否运行”,但没有其他消息。数据不会插入到数据库中。此外,我回显了 SQL 字符串和变量,并直接针对 MySQL 运行它,它插入了 OK。不确定我上面非常简单的代码中发生了什么。

此外,在我的应用程序中的其他页面中插入正常,但由于某种原因,此页面无法正常工作。

我知道我的错误报告有点矫枉过正,但我把我能想到的一切都扔了出去,看看某处是否存在错误,但这对我来说是一个令人头疼的问题。感谢您的任何帮助!

php mysqli 准备语句

评论

0赞 Aranxo 1/12/2023
您确定所有三个参数都是字符串吗?变量名称看起来更像“iii”,因为您有两个 ID 和一个计数器。数据库字段的数据类型是什么?
1赞 Dharman 1/12/2023
这种矫枉过正的错误处理实际上可能隐藏了正确的错误。您应该删除所有代码,只保留 3 行:prepare、bind 和 execute。
0赞 Wil 1/12/2023
@Aranxo 都是整数,在示例中,我尝试运行其 2、56、4
0赞 Dharman 1/12/2023
代码中没有错误。除了所有这些无关的错误检查之外,它看起来是正确的。
0赞 Wil 1/12/2023
@Dharman,是的,这也是我想的,我整个上午都在敲头,看起来很简单,也许我会尝试没有准备好的陈述作为测试,看看会发生什么

答:

1赞 Your Common Sense 8/20/2023 #1

如果您的查询似乎不起作用,可能是由以下原因引起的:

  • 由于程序逻辑不正确,SQL 根本没有运行。将临时调试输出添加到尽可能多的位置(或使用编辑器中的步骤调试功能),以遵循程序的逻辑,并确保代码实际上到达了必须执行查询的点。
  • 查询执行期间出现错误。查看这些答案,了解有关如何为 mysqliPDO 配置正确错误报告的详细说明。

因此,您的代码应该是这样的(鉴于前三行应该移动到您将在此处包含的某个引导文件中)

echo "Start\n"; // debugging statement, remove after resolving the issue

$sqlInsert = "INSERT INTO deck_cards (deckid, cardid, qty) VALUES (?,?,?)";
$stmtInsert = $conn->prepare($sqlInsert);
$stmtInsert->bind_param("sss", $deckid, $cardid, $cardcount);

echo "INSERT done\n"; // debugging statement, remove after resolving the issue

如果查询已实际执行,并且没有错误,则表示查询成功。您仍然无法观察到所需的结果:

  • 对于不返回预期值的 SELECT 查询,输入数据肯定与数据库中的数据不匹配。以下是有关如何调试它的一些建议
  • 如果是 INSERT(或其他数据修改查询),则可能是在错误的数据库中查看了结果。要获得证明,请打印出 / 和/或 的结果。您也可以选择插入的数据并将其打印出来,直接位于 INSERT 下方。然后仔细检查您正在使用的程序的数据库凭据以查看结果。insert_idaffected_rowsmysqli_info()
  • 代码中的某个位置有一个打开的事务或自动提交设置为 0,但没有显式提交。检查您的代码并删除或添加 .begincommit