首页 文章

mysqli查询中的bind_param()错误

提问于
浏览
1

我的代码有问题 . 我在我的查询中使用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 回答

  • 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() ,您需要在将它们连接到查询之前转义字符串 .

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

相关问题