2017-03-08 6 views
0

받은 편지함 시스템에서 작업하고 있습니다. 프런트 엔드에서는 jQuery와 Ajax를 사용하므로 페이지가 새로 고쳐지지 않습니다. 나는 그 부분을 다루었 다. 백엔드에는 데이터를 삽입하는 3 개의 테이블 (현재는)이 있습니다. 여기 PHP 하나의 테이블 (MySQL)에 데이터를 삽입하는 준비된 문

는 관계 구조의 기본 개요입니다 다음 SENDER_ID는 항상 0이기 때문에

conversations: 
conversation_id int(11) primary key 
conversation_subject varchar(128) 

conversations_members: 
conversation_id int(11) 
user_id int(11) 
conversation_last_view int(10) 
conversation_deleted int(1) 

conversations_messages: 
message_id int(11) primary key 
conversation_id int(11) 
user_id int(11) 
message_date timestamp 
message_text text 

추가적인 문제가 있습니다,하지만 그것이 주제와 이후 또 다른 질문을 위해해야 ​​할 것이다. 문제는 conversations_members 테이블에 있습니다. 다른 모든 것은 conversations 및 conversations_messages 테이블에 입력됩니다. 다음은 PHP입니다. 이 문제는 아래쪽의 마지막 SQL 쿼리입니다.

<?php 
ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

include('../inc/connect.php'); 
if (!isset($_SESSION['username'])) { 
    session_start(); 
} 
$recipient_username = ""; 
$sender_id = ""; 
$a = 0; 
$b = 0; 
if(isset($_POST['subject'], $_POST['msg_body']) &&  !empty($_POST['subject']) && !empty($_POST['msg_body'])) { 

//get ID of sender 
$sender_id_query = "SELECT id FROM `users` WHERE username = ?"; 
$stmt = $connection->prepare($sender_id_query); 
$stmt->bind_param('s', $_SESSION['username']); 
$stmt->execute(); 
$result = mysqli_query($connection, $sender_id_query); 
if($result) { 
    while($row = mysqli_fetch_assoc($result)) { 
     //$row['id'] = $sender_id;   //neither of these work 
     $sender_id = $connection->insert_id; //Always zero 
    } 
} 
$stmt->close(); 

//get username of recipient 
$recipient_name_query = "SELECT * FROM `users`"; 
$result = mysqli_query($connection, $recipient_name_query); 
if($result) { 
    while($row = mysqli_fetch_assoc($result)) { 
     $row['username'] = $recipient_username; 
    } 
} 
//define post variables 
$msg_subject = $_POST['subject']; 
$msg_body = $_POST['msg_body']; 
$subject = $connection->real_escape_string(htmlentities($msg_subject)); 
$body = $connection->real_escape_string(htmlentities($msg_body)); 
$conversation_id = mysqli_insert_id($connection); 


//GET RECIPIENT ID 
$sql = "SELECT id FROM `users` WHERE username=?"; 
$stmt = $connection->prepare($sql); 
$stmt->bind_param('s', $recipient_username); 
$result = mysqli_query($connection, $sql); 
if ($result) { 
    while ($row = mysqli_fetch_assoc($result)) { 
     $recipient_id = $row['id']; 
    } 
} 
$stmt->close(); 

//INSERT SUBJECT INTO CONVERSATIONS TABLE 
$stmt = $connection->prepare("INSERT INTO `conversations` (conversation_subject) VALUES(?)"); 
$stmt->bind_param('s', $subject); 
$stmt->execute(); 
$stmt->close(); 


//INSERT THE IDs AND TIMESTAMPS INTO MESSAGES TABLE 
$stmt = $connection->prepare("INSERT INTO `conversations_messages` (conversation_id, user_id, message_date, message_text) 
           VALUES(?, ?, NOW(), ?)"); 
$stmt->bind_param('iis', $conversation_id, $sender_id, $body); 
$stmt->execute(); 
$stmt->close(); 

/* 
THE FOLLOWING DATA DOES NOT GET INSERTED..... 
*/ 
//INSERT IDs, LAST_VIEWED, AND DELETED INTO MEMBERS TABLE 
$stmt = $connection->prepare("INSERT INTO `conversations_members` (conversation_id, user_id, conversation_last_view, conversation_deleted) 
           VALUES (?, ?, ?, ?)"); 
$stmt->bind_param('iiii', $conversation_id, $recipient_id, $a, $b); 
$stmt->execute(); 
$stmt->close(); 
} 

오류가 발생하지 않으며 오타가 표시되지 않습니다. 나는 어디로 잘못 갔는가?

+0

시도 디버깅 : '$ Q = $ stmt-> bind_param ('IIII '$ conversation_id, $ recipient_id, $ A, $ b),'' 위해서 var_dump ($의 Q); var_dump ($ stmt-> error)' –

+0

추가'ini_set ('display_errors', 1); ini_set ('log_errors', 1); error_reporting (E_ALL); mysqli_report (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);'를 스크립트 상단에 추가하십시오. 이것에 의해, mysqli_의 모든 에러가 강제적으로 무시되어 버리거나 무시할 수없는 Exception을 생성한다 ( ). – RiggsFolly

+0

'mysqli_fetch_assoc()'은 객체가 아닌 배열을 반환합니다. 따라서'$ sender_id = $ row [ 'id']' – RiggsFolly

답변

0

추가적인 오류 검사 제안 덕분에 어떤 일이 일어나고 있는지 발견하게되었습니다. 나는 완전히 while 루프를 제거하고, while 루프를 제거한 후에 다른 에러를 발견 한 이후에 각각의 $ stmt 변수에 자신의 이름을 주었다. 이전 명령문이 닫히지 않았기 때문에 첫 번째 명령문 이후의 모든 명령문은 FALSE 값을 리턴합니다. 이 코드는 작동합니다. 오류가 발생하지 않으며 필요에 따라 모든 것을 데이터베이스에 삽입합니다.

$recipient_username = $_GET['username']; 
$username = $_SESSION['username']; 
$a = 0; 
$b = 0; 


//get ID of sender 
$sender_id_query = "SELECT id FROM `users` WHERE username = ?"; 
$stmt = $connection->prepare($sender_id_query); 
$stmt->bind_param('s', $username); 
$stmt->execute(); 
$stmt->bind_result($sender_id); 
$val = $stmt->fetch()[$sender_id]; 
$stmt->close(); 

//define post variables 
$msg_subject = $_POST['subject']; 
$msg_body = $_POST['msg_body']; 
$subject = $connection->real_escape_string(htmlentities($msg_subject)); 
$body = $connection->real_escape_string(htmlentities($msg_body)); 
$conversation_id = mysqli_insert_id($connection); 

//GET RECIPIENT ID 
$recipient_id_query = "SELECT id FROM `users` WHERE username=?"; 
$stmt2 = $connection->prepare($recipient_id_query); 
$stmt2->bind_param('s', $recipient_username); 
$stmt2->execute(); 
$stmt2->bind_result($recipient_id); 
$val_2 = $stmt2->fetch()[$recipient_id]; 
$stmt2->close(); 

//INSERT SUBJECT INTO CONVERSATIONS TABLE 
$stmt3 = $connection->prepare("INSERT INTO `conversations` (conversation_subject) VALUES(?)"); 
$stmt3->bind_param('s', $subject); 
$stmt3->execute(); 
$stmt3->close(); 

//INSERT THE IDs AND TIMESTAMPS INTO MESSAGES TABLE 
$stmt4 = $connection->prepare("INSERT INTO `conversations_messages` (conversation_id, user_id, message_date, message_text) 
           VALUES(?, ?, NOW(), ?)"); 
$stmt4->bind_param('iis', $conversation_id, $sender_id, $body); 
$stmt4->execute(); 
$stmt4->close(); 


//INSERT IDs, LAST_VIEWED, AND DELETED INTO MEMBERS TABLE 
$stmt5 = $connection->prepare("INSERT INTO `conversations_members` (conversation_id, user_id, conversation_last_view, conversation_deleted) 
           VALUES (?, ?, ?, ?)"); 
$q = $stmt5->bind_param('iiii', $conversation_id, $recipient_id, $a, $b); 
$stmt5->execute(); 
$stmt5->close();