2017-03-08 15 views
0

私はインボックスシステムで作業しています。フロントエンドでは、jQueryとAjaxを使用しているため、ページは更新されません。私はその部分を扱った。バックエンドには、データを挿入するテーブルが3つあります(今のところ)。ここでPHP 1つのテーブル以外のすべてのテーブルにデータを挿入するプリペアドステートメント(MySQL)

は関係構造の基本的な荒廃です:

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 

ありsender_idのは常に0であるため、追加的な問題があるが、それはオフトピックですので、それは別の質問のためにする必要があります。 問題は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_'エラーは、あなたが見逃したり無視したりすることができないように、例外を生成するための に強制されます。 – 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(); 
関連する問題