使用 mysqli_stmt 时 PhP 可捕获的致命错误

Posted

技术标签:

【中文标题】使用 mysqli_stmt 时 PhP 可捕获的致命错误【英文标题】:PhP catchable fatal error when using mysqli_stmt 【发布时间】:2015-09-17 11:45:04 【问题描述】:

我已尝试搜索论坛,但在编写我的 php 准备语句时无法修复我的致命错误。

我使用准备好的语句来防止 sql 注入并防止用户输入撇号时出错。以下是我的代码:

提交数据.php

<?php
include "../connect.php";

$message_form = $_POST['message'];
$username_form = $_POST['user'];

// $insert_data=$db->query("INSERT INTO test_table_1(message,user) VALUES ('$message_form','$username_form')");

$insert_data=$db->prepare("INSERT INTO test_table_1(message,user) VALUES (?, ?)");

$insert_data->bind_param("ss", $message_form, $username_form);
$insert_data->execute();


if ($insert_data === TRUE )
    echo "New record created successfully";

 else 
    echo "Error: " . $insert_data . "<br>" . $db->error;
  

$insert_data->close();
$db->close();
?>

我的数据库连接文件(connect.php)

<?php

            $host = "localhost";
            $user = "root";
            $pass = ""; 

            $database_name = "test"; 
            $table_name = "test_table_1";  

            //connect to mysql database
            $db = new mysqli($host, $user, $pass, $database_name); 
            //check connection
            if ($db -> connect_error) 
                die("error mysql database not connected: " . $db -> connect_error);
            
            // else 
            //  echo "connected successfully" ; //enable this for debugging purpose 
            //             

?>  

这是我收到的错误

可捕获的致命错误: mysqli_stmt 类的对象无法在 中转换为字符串 /Applications/XAMPP/xamppfiles/htdocs/z_admin/submit_data.php 上线19

任何帮助或指示将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

不要在这一行回显$db-&gt;error,因为它包含您的数据库连接对象

echo "Error: " . $insert_data . "<br>" . $db->error;

改为使用affected_rows 返回上次查询中使用的自动生成的id

if ($insert_data->affected_rows >0)
    echo "New record created successfully";

 else 
    echo "Not inserted";
  

【讨论】:

我明白了,谢谢您的帮助。是的,现在没有错误。数据库中的对象是什么意思? @Saty【参考方案2】:

这样重写你的代码

connect.php

<?php
$host = "localhost";
$user = "root";
$pass = ""; 

$database_name = "test"; 
$table_name = "test_table_1";  

//connect to mysql database
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli($host, $user, $pass, $database_name); 

提交数据.php

<?php
include "../connect.php";

$stmt=$db->prepare("INSERT INTO test_table_1(message,user) VALUES (?, ?)");

$stmt->bind_param("ss", $_POST['message'], $_POST['user']);
$stmt->execute();
echo "New record created successfully";

此方法添加了您可以想象的最佳错误检查。

【讨论】:

感谢您的反馈,但希望在存在错误时打印到控制台,是的,您的方法也有效,因为它删除了错误检查。

以上是关于使用 mysqli_stmt 时 PhP 可捕获的致命错误的主要内容,如果未能解决你的问题,请参考以下文章

mysqli_stmt 类的对象在执行时无法转换为字符串

致命错误:调用未定义的方法 mysqli_stmt::get_result()

PHP中的MySQLi扩展学习MySQLI_STMT对象操作

mysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配

mysqli_stmt::bind_param():变量的数量与准备好的语句中的参数数量不匹配

PHP:异常和可捕获的致命错误有啥区别?