2014-10-25 5 views
1

내 코드에 문제가 있습니다. 내 쿼리에서 bind_param() 멤버 함수를 사용하지만 코드에 오류가 있습니다. 내 코드의 버그가 어디 있는지 모르겠습니다. 이 내 코드의 조각 : 치명적인 오류 : (멤버 함수의 bind_param에 전화) C에서 비 객체 : \ XAMPP \ 내가 코드를 실행하면, 내가 오류가 발생했습니다 mysqli 쿼리의 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'); 
?> 

htdocs \ IBAD \ Kantin_Pakoper \ change_alternatif_process.php on line 40

내 코드 또는 내 쿼리에 어떤 문제가 있는지 알 수 없습니다.

답변

2

prepare() 전화로 오류가 발생 했으므로 mysqli_stmt 대신 false을 반환합니다. 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 (?,?,?,?)"; 

난 당신이 그들이 필요하지 않더라도, 역 따옴표의 모든 열 이름을 넣어 이상한 찾을 수 있습니다,하지만 당신은 'didn를 : 테이블 이름으로 사용하려면 역 따옴표에 넣어 필요 테이블 이름을 backticks에 넣지 마십시오.

또한 다른 모든 쿼리에 대해 준비된 문을 사용하지 않는 이유는 무엇입니까? 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의 문제는 당신이

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

내가 지금 가지고있는 올바른 마크 업에 테이블 이름을 둘 필요가 있으므로 update이 MySQL을 (그리고 일반적으로 SQL)에 특별한 단어가 있다는 것이다 (btw 편집 후 Barmar는 답을 훔치지 않았습니다.) – worldofjr

+0

내가 말한 것이 아닙니다. 다시 읽으세요. – worldofjr

+0

@worldofjr 마스터 감사합니다. 그것은 일이다. 나는 한 시간 동안 그 코드에 갇혀있다 : D –