1

これがテーブル構造です

CREATE TABLE IF NOT EXISTS `result` (
`res_id` int(11) NOT NULL AUTO_INCREMENT,
`s_id` int(10) NOT NULL,
`i_id` int(6) NOT NULL,
`r_status` text NOT NULL,
`r_score` decimal(6,0) NOT NULL,
PRIMARY KEY (`res_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

私は解決策を探し、さまざまな機会に試してみました。テーブルを最初から作成し、ドロップしてインポートし直し、インデックスをチェックしました。ご覧のとおり、id の名前を res_id に変更しましたが、ブラウザーで実行すると、エラーにはまだ r_id が表示されます。

違いが生じる場合、id が自動インクリメントに設定されていない場合、同じエラーがポップアップします。

データベースに挿入するページのコード スニペットを次に示します。

//retrieve existing r_id
$sql_res = "SELECT res_id FROM result ORDER BY res_id DESC LIMIT 1";
$query_res = mysql_query($sql_res) or die("MySQL Error: " . mysql_error());
$data_res = mysql_fetch_assoc($query_res);
$resid_count = $data_res['res_id']+1;
//echo "<br>Result: " . $resid_count;

// insert result to table
$sql_result = "INSERT INTO result (res_id, r_score, s_id, i_id) VALUES ('" . $resid_count . "', '" . $correct . "',  '" . $id . "',  '" . $ins_id . "')";
mysql_query($sql_result) or die ("Error: " . mysql_error());

編集:皆さんが提案したようにコードを変更しました。INSERT から res_id を取り出しました。r_idのエントリが重複しています。試行錯誤を重ね、同じ構造の別のテーブル「score」を作成して「result」を置き換えました。同じテーブル名が問題を引き起こしているのではないかと考えていました (ページを何度も実行すると、この問題が発生する可能性がありますか?)。スコア表と同じ結果。

どんな助けでも大歓迎です。ここで立ち往生していて、プロジェクトを進めることができません。ありがとう。

アティカ

4

3 に答える 3

2

res_id挿入クエリを次のように置き換えることをAUTO_INCREMENTお勧めします。

$sql_result = "INSERT INTO result (r_score, s_id, i_id) VALUES ('". $correct . "',  '" . $id . "',  '" . $ins_id . "')";
于 2013-04-07T10:46:33.973 に答える
1

これを試して

   $sql_result = "INSERT INTO result ( r_score, s_id, i_id) VALUES ( '" . $correct . "',  '" . $id . "',  '" . $ins_id . "')";

res_id挿入しなくても自動的に挿入されます

編集。

挿入するだけの場合は、それらの行は必要ありません。最後の res_id を知るために使用しているため、削除するだけです。auto_increment の前に言った res_id 以来。自動的に増加します

   $sql_res = "SELECT res_id FROM result ORDER BY res_id DESC LIMIT 1";
   $query_res = mysql_query($sql_res) or die("MySQL Error: " . mysql_error());
   $data_res = mysql_fetch_assoc($query_res);
   $resid_count = $data_res['res_id']+1;
于 2013-04-07T10:44:44.047 に答える
0

数値 (int) を使用する SQL ではアポストロフィを使用しないでください。トラブルの原因となります。res_id はまったく関与しないでください。これが、自動インクリメンタル列を持つポイントであるためです (PHP コードを使用してデータベース内の次の ID を検索する必要はありません。DB が処理します)。

コードは次の 2 行に変換できます。

$sql_result = "INSERT INTO result (r_score, s_id, i_id) VALUES (" . $correct . ",  " . $id . ",  " . $ins_id . ")";
mysql_query($sql_result) or die ("Error: " . mysql_error());

OR (引用符内の変数は実際の値を示します)

$sql_result = "INSERT INTO result (r_score, s_id, i_id) VALUES ($correct, $id, $ins_id)";
mysql_query($sql_result) or die ("Error: " . mysql_error());

もちろん、mysql_* 関数は使用しないでください。これらの関数は推奨されていないためです。SQL インジェクションを安全な方法で回避できるように、代わりに PDO または Mysqli をパラメーターと共に使用してください。取得したコードは、SQL インジェクションに対して脆弱です。

于 2013-04-07T11:11:33.143 に答える