mysqli查询中的bind_param()错误

时间:2014-10-25 07:24:24

标签: php mysqli sqlbindparameter

我的代码有问题。 我在我的查询中使用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()

我不知道我的代码或查询有什么问题。

2 个答案:

答案 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 (?,?,?,?)";