添加注册日期并得到“调用成员函数 bind_param布尔值上的 )”错误


adding registration date and get 'Call to a member function bind_param() on boolean' error

我正在做一个项目,刚刚被告知我需要在我的注册表中添加注册日期,然后我做了我认为应该修复它的事情,但反而得到了一个致命的错误。这段代码有什么问题?因为在我添加 registration_date + CURRENT_TIMESTAMP 之前它运行良好。

$firstname = $_POST['firstname'];
$surname = $_POST['surname'];
$email = $_POST['email'];
$address = $_POST['address'];
$postcode = $_POST['postcode'];
$telephone = $_POST['telephone'];
$username = $_POST['username'];
$password = $_POST['password'];
$q = "INSERT INTO tbl_customers (firstname, surname, email, address, postcode, telephone, username, password, registration_date)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
$stmt = $dbc->prepare($q);
$stmt->bind_param('ssssssss', '$firstname', '$surname', '$email', '$address', '$postcode', '$telephone', '$username', md5('$password'), CURRENT_TIMESTAMP);
$r = $stmt->execute();
if ($r === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $q . "<br>" . $dbc->error;
}

谢谢。

任何时候你得到...

"致命错误:调用布尔值上的成员函数 bind_param() "

。这可能是因为您的查询存在问题。prepare()可能会返回FALSE(布尔值),但此通用失败消息不会给您留下太多线索。你如何找出你的查询有什么问题?你

首先,确保错误报告已打开且可见:将这两行添加到文件顶部,紧跟在开始<?php标签之后:

error_reporting(E_ALL);
ini_set('display_errors', 1);

如果您的错误报告已在 php 中设置.ini则不必担心这一点。只要确保优雅地处理错误,并且永远不要向用户透露任何问题的真正原因。向公众揭示真正的原因可能是那些想要损害您的网站和服务器的人的黄金雕刻邀请。如果您不想向浏览器发送错误,您可以随时监控 Web 服务器错误日志。日志位置因服务器而异,例如,在 Ubuntu 上,错误日志通常位于 /var/log/apache2/error.log .如果要在 Linux 环境中检查错误日志,则可以在控制台窗口中使用tail -f /path/to/log来实时查看错误。或者当你制作它们时。

一旦您确定了标准错误报告,在数据库连接和查询上添加错误检查将为您提供有关正在发生的问题的更多详细信息。请查看列名不正确的此示例。首先,返回一般致命错误消息的代码:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

该错误是通用的,对您解决正在发生的事情不是很有帮助。

通过多几行代码,您可以获得非常详细的信息,您可以使用这些信息立即解决问题。检查prepare()语句的真实性,如果它很好,您可以继续绑定和执行。

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

如果出现问题,您可以吐出一条错误消息,直接将您带到问题所在。在这种情况下,表中没有foo列,解决问题是微不足道的。

如果愿意,可以将此检查包含在函数或类中,并通过如前所述优雅地处理错误来扩展它。