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");
それは、コンソールおよびデータベース自体に表示:
表の作成方法以外は変更されていない場合は、外部キーの追加、および表内の表/フィールドの名前私は何が欠けていますか?
<?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;
}
私が試した私が試した何
他の質問を表示していますが、新しいテーブルを作成する前に私のケースがユニークだったと思います。
*プリペアドステートメントを使用している場合は、 'real_escape_string()'を使用するのは無意味です。また、 'prepare()'は値を返します。 '$ connection' goはチェックされていません。接続に失敗したらどうしますか? 'fetch()'は 'true'、' false'、 'null'を返すことができます。それをチェックしてください。 – Xorifelse
Derp。私は最近real_escape_stringについて学びました。私はまだそれを削除していない。私の悪い。 – IRGeekSauce
そして、今私が心配しているのは、新しいテーブルを作成してコード内のテーブル/フィールド名のみを編集する前に、なぜそれがうまくいったのかということです。私は後で残りを修正することができます。他の場所での接続エラーが報告されています。私はこの機能について今は心配しています。 – IRGeekSauce