2017-03-12 10 views
0

EDIT:これはthisの重複としてマークされています: "自分のLOCAL/DEV環境でmysqliクエリは正常に実行されます。 WEBHOST環境でこのエラーが発生しました。 " ライブウェブホストに移動しませんでした。これはローカルホストのみであり、問​​題はデータベース内のテーブルを置き換えた後です。それは決して関連していません。データベースで置換されたテーブルの後でクエリがPHPプリペンドドステートメントで置換されていない

PHPで小さな会話データベースを作成するためのチュートリアルを使用しましたが、これは8年近く前からあり、廃止予定のmysql *関数を使用していました。私はテーブルには私が必要とした外部キ​​ーがないことも分かりました。データがデータベースに正しく挿入されても、構造を変更したいと考えました。元のテーブルを削除し、外部キーを使用して新しいテーブルを作成しました。

私は準備済みの文を使用しています。新しいテーブルを作成した後は、というテーブルとフィールドの名前だけがです。他に何も変わっていない。問題は、何もデータベースにINSERTされていないことです。エラーは発生していません。 PhpMyAdminとPHPStormのDBコンソールでクエリを直接実行すると、データが挿入されます。

何か不足していますか?私は文字通りコードに入り、INSERTクエリのテーブル/属性名を編集しました。それで全部です。

if (isset($_POST['subject'], $_POST['msg_body']) && !empty($_POST['subject']) && !empty($_POST['msg_body'])) { 

    include('connect.php'); 

    //Grab POST vars 
    $recipient_name = $_GET['username']; 
    $sender_name = $_SESSION['username']; 
    $user_1_status = 0; 
    $user_2_status = 0; 
    $msg_subject = htmlentities($_POST['subject']); 
    $msg_body = htmlentities($_POST['msg_body']); 
    $sender_id = ""; 
    $recipient_id = ""; 
    $conversation_id = mysqli_insert_id($connection); 
    echo json_encode(array("Server sent back" =>$msg_subject, $msg_body)); //For debugging 

    //GET IDs OF SENDER and RECIPIENT 
    $query = "SELECT * FROM `users` WHERE username=? OR username=?"; 
    if(!$stmt = $connection->prepare($query)) { 
     echo $stmt->error; 
    } else { 
     if(!$stmt->bind_param('ss', $sender_name, $recipient_name)) { 
      echo $stmt->error; 
     } else { 
      $stmt->execute(); 
     } 
    } 
    $result = $stmt->get_result(); 
    while($row = $result->fetch_assoc()) { 
     if($row['username'] == $sender_name) { 
      $sender_id = $row['id']; 
      $sender_name = $row['username']; 
     } else { 
      $recipient_id = $row['id']; 
      $recipient_name = $row['username']; 
     } 
    } 
    $stmt->close(); 

    $query = "INSERT INTO `conversation` (conversation_subject, user_1, user_2, time, user_1_status, user_2_status) 
       VALUES (?, ?, ?, CURRENT_TIMESTAMP(), ?, ?)"; 
    if(!$stmt=$connection->prepare($query)) { 
     echo $stmt->error; 

    } else { 
     if(!$stmt->bind_param('siiii', $msg_subject, $sender_id, $recipient_id, $user_1_status, $user_2_status)) { 
      echo $stmt->error; 
     } else { 
      $stmt->execute(); 
      $stmt->close(); 
      $connection->close(); 
     } 
    } 
} 

元のテーブルをphpMyAdminにGUIで直接作成された:ここでクエリ(このファイルは、別のページからアクセスさ)です。私は、コードを介して、先に行って、新しいものを作成しました:

include_once("../inc/connect.php"); 
$table_conversation = "CREATE TABLE IF NOT EXISTS conversation(
         conversation_id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
         conversation_subject varchar(128), 
         user_1 int(11) NOT NULL, 
         user_2 int(11) NOT NULL, 
         time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(), 
         user_1_status int(1) NOT NULL, 
         user_2_status int(1) NOT NULL, 
         FOREIGN KEY (user_1) REFERENCES users(id), 
         FOREIGN KEY (user_2) REFERENCES users(id))"; 

$query = mysqli_query($connection, $table_conversation); 
if($query === TRUE) { 
    echo "<h3>Conversation Table created</h3>"; 
} else { 
    echo "<h3>Conversation Table <strong>not</strong> created</h3>"; 
    printf("Error code: %d<br/>", mysqli_errno($connection)); 
    echo ("Error description: " . mysqli_error($connection)); 
} 

$table_reply = "CREATE TABLE IF NOT EXISTS conversation_reply(
       reply_id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, 
       reply text, 
       user_id_fk int(11) NOT NULL, 
       time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(), 
       conversation_id_fk int(11) NOT NULL, 
       FOREIGN KEY (user_id_fk) REFERENCES users(id), 
       FOREIGN KEY (conversation_id_fk) REFERENCES conversation(conversation_id))"; 

$query = mysqli_query($connection, $table_reply); 
if($query === TRUE) { 
    echo "<h3>Reply Table created</h3>"; 
} else { 
    echo "<h3>Reply Table <strong>not</strong> created</h3>"; 
    printf("Error code: %d<br/>", mysqli_errno($connection)); 
    echo("Error description: " . mysqli_error($connection)); 
} 

はここPHPStormでDBコンソールを介したクエリの例です:

INSERT INTO conversation (conversation_subject, user_1, user_2, time, user_1_status, user_2_status) 
VALUES ("Hello", "1", "11", CURRENT_TIMESTAMP(), "0", "0"); 

それは、コンソールおよびデータベース自体に表示:

Query Result

表の作成方法以外は変更されていない場合は、外部キーの追加、および表内の表/フィールドの名前私は何が欠けていますか?

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

と私は実行ステートメントにこれを追加してみました:私は私のファイルの先頭にこれを持って

if(!$stmt3->execute()) { //same for all the others ($stmt, $stmt2, etc) 
    echo $stmt3->error; 
} 

私が試した私が試した何

他の質問を表示していますが、新しいテーブルを作成する前に私のケースがユニークだったと思います。

+1

*プリペアドステートメントを使用している場合は、 'real_escape_string()'を使用するのは無意味です。また、 'prepare()'は値を返します。 '$ connection' goはチェックされていません。接続に失敗したらどうしますか? 'fetch()'は 'true'、' false'、 'null'を返すことができます。それをチェックしてください。 – Xorifelse

+0

Derp。私は最近real_escape_stringについて学びました。私はまだそれを削除していない。私の悪い。 – IRGeekSauce

+0

そして、今私が心配しているのは、新しいテーブルを作成してコード内のテーブル/フィールド名のみを編集する前に、なぜそれがうまくいったのかということです。私は後で残りを修正することができます。他の場所での接続エラーが報告されています。私はこの機能について今は心配しています。 – IRGeekSauce

答えて

0

私は

mysqli_report(MYSQLI_REPORT_ALL) 

が含まれている場合this SO postはMySQLのエラー報告の行動を説明する見つけました。そこで、私は

に変更しました。
mysqli_report(MYSQLI_REPORT_OFF) 

ここで、ネットワークタブにはエラーがなくなり、クエリは正しく実行されます。

DB Row

これは私のテーブル構造を変更した後、なぜ起こったか、私はまだわからないが、私はそれは私が新しいテーブルにインデックスを設定しなかったという事実に関連していますと仮定しています。

コメントは私の質問には答えませんでしたが、エラー報告のより良い方法を提案していただきありがとうございます。今私は最終的にこれで前進することができます! :-)

+0

いいえ、私は別の環境に移動しているわけではないので、これは重複していません。この質問は、全く新しいホストに移動するのではなく、新しいテーブルを作成することによるものです。私はとにかくそれを考え出した。 – IRGeekSauce

関連する問題