我的代码有问题。 我在我的查询中使用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:\ xampp \ htdocs \ IBAD \ Kantin_Pakoper \ change_alternatif_process.php中的非对象上调用成员函数bind_param()
我不知道我的代码或查询有什么问题。
答案 0 :(得分:2)
您在致电prepare()
时收到错误消息,因此正在返回false
而不是mysqli_stmt
。要查看MySQL错误消息,请执行以下操作:
$statement_insert = $database->prepare($query_insert) or die($database->error);
在这种情况下,问题是update
是MySQL保留字。要将它用作表名,您需要将其放在反引号中:
$query_insert = "INSERT INTO `update` (`id_menu_alt`, `id_user`, `id_hari`, `id_sesi`) VALUES (?,?,?,?)";
我觉得很奇怪,你把所有列名都放在反引号中,即使它们不需要它,但是你没有把表名放在反引号中。
另外,为什么不为所有其他查询使用预准备语句?如果不使用bind_param()
,则需要先将字符串转义,然后再将它们连接到查询中。
答案 1 :(得分:0)
您的查询未正确准备,可能是因为语法不正确。将来在准备中使用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 (?,?,?,?)";