如何在非对象上使用bind_param解决问题


How to solve a problem with bind_param on a non-object?

我在查询中使用了bind_param()成员函数,但我的代码出错了。这是我的代码:

<?php
session_start();
include_once 'functions.php';
loging(basename(__FILE__));
if (!isset($_SESSION['user'])) {
    redirect('login.php');
}
$day_id = date('w');
$database = new mysqli('127.0.0.1', 'user', 'user', 'kantin');
$sesi = $_POST['sesi'];
$lauk = $_POST['lauk'];
$sayur = $_POST['sayur'];
$minuman = $_POST['minuman'];
$user = $_SESSION['username'];
$query_user = "SELECT * FROM user WHERE username LIKE '" . $user . "'";
$statement_user = $database->query($query_user);
$row_user = $statement_user->fetch_assoc();
$id_user = $row_user['user_id'];
$query_sesi = "SELECT * FROM sesi WHERE sesi LIKE '" . $sesi . "'";
$statement_sesi = $database->query($query_sesi);
$row_sesi = $statement_sesi->fetch_assoc();
$id_sesi = $row_sesi['sesi_id'];
$query_alt_id = "SELECT * FROM alternatif WHERE id_hari='" . $day_id . "' AND id_sesi= '" . $id_sesi . "' AND lauk_alt LIKE '" . $lauk . "'";
$statement_alt_id = $database->query($query_alt_id);
while ($row_alt_id = $statement_alt_id->fetch_assoc()) {
    $id_alt = $row_alt_id['alternatif_id'];
    $id_menu = $row_alt_id['lauk_alt'];
    $id_hari = $row_alt_id['id_hari'];
    $id_sesi = $row_alt_id['id_sesi'];
}
$query_insert = "INSERT INTO update (`id_menu_alt`, `id_user`, `id_hari`, `id_sesi`) VALUES (?,?,?,?)";
$statement_insert = $database->prepare($query_insert);
$statement_insert->bind_param('iiii', $id_alt, $id_user, $id_hari, $id_sesi);
$statement_insert->execute();

redirect('today_menu.php');
?>

当我执行代码时,我得到错误:

致命错误:在第40行的C:''examplep''htdocs''IBAD''Kantin_Pakoper''change_alternatif_process.php中的非对象上调用成员函数bind_param()

您从对prepare()的调用中得到一个错误,因此它返回的是false而不是mysqli_stmt。要查看MySQL错误消息,请执行:

$statement_insert = $database->prepare($query_insert) or die($database->error);

在这种情况下,问题是update是MySQL的保留字。要将其用作表名,您需要将其放在backtick:中

$query_insert = "INSERT INTO `update` (`id_menu_alt`, `id_user`, `id_hari`, `id_sesi`) VALUES (?,?,?,?)";

我觉得奇怪的是,你把所有的列名都放在了backticks中,即使他们不需要,但你没有把表名放在backticks。

另外,为什么不将准备好的语句用于所有其他查询呢?如果不使用bind_param(),则需要先转义字符串,然后再将它们连接到查询中。

您的查询没有准备好,可能是因为语法不正确。将来在prepare中使用if语句,以便在语法错误时避免其他操作,如下所示;

if($statement_insert = $database->prepare($query_insert)) {
   $statement_insert->bind_param('iiii', $id_alt, $id_user, $id_hari, $id_sesi);
   $statement_insert->execute();
}
elseif($database->error) {
   echo "Could not prepare SQL: " . $database->error;
}

当前SQL的问题是update在MySQL(以及一般的SQL)中是一个特殊的单词,因此您需要将表名放在正确的标记中

$query_insert = "INSERT INTO `update` (`id_menu_alt`, `id_user`, `id_hari`, `id_sesi`) VALUES (?,?,?,?)";