0

次のコードが必要です:

http://www.nomorepasting.com/getpaste.php?pasteid=22987

PHPSESSIDまだテーブルにない場合、REPLACE INTOクエリは正常に機能しますが、PHPSESSID存在する場合、実行の呼び出しは成功しますが、sqlstate は「HY000」に設定されます。これはあまり役に立たず$_mysqli_session_write->errno$_mysqli_session_write->error両方とも空であり、データ列は更新されません。

テーブルにREPLACE INTOあるかどうかに関係なく、mysql から手動で実行すると問題なく動作するため、スクリプトのどこかに問題があることは確かです。PHPSESSID

4

3 に答える 3

1

REPLACE INTO2つのクエリを実行します:最初にa、DELETE次にINSERT INTO。(したがって、新しいauto_incrementは「設計による」です)

REPLACE INTOデータベースセッションにもを使用していますが、の代わりにMySQLi->query()とを組み合わせて使用​​していますMySQLI->real_escape_string()MySQLi->prepare()

于 2009-01-11T12:44:38.297 に答える
1

セッションを開く関数で準備をしようとしているのはなぜですか? セッション中に書き込み関数が複数回呼び出されるとは思わないので、オープンに準備してもあまり効果がありません。セッション書き込みでそれを行うこともできます。

とにかく、テーブル名の後と列リストの前に空白が必要だと思います。空白がなければ、mysql は、session() という名前の存在しない関数を呼び出そうとしたかのように動作すると思います。

REPLACE INTO session (phpsessid, data) VALUES(?, ?)

MySQL では、'COUNT ( )' と 'COUNT( ) ' に違いはありません。

興味深いことに、mysql CLI で以下を実行すると、異なる結果が得られるようです。

mysql> select count (*);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*)' at line 1
mysql> select count(*);
+----------+
| count(*) |
+----------+
|        1 | 
+----------+
1 row in set (0.00 sec)
于 2008-12-24T09:25:41.423 に答える
0

したがって、REPLACE の使用には、私が認識していなかった他の問題があることが判明しました。

バグ #10795: REPLACE は新しい AUTO_INCREMENT を再割り当てします (コメントによると、これは実際にはバグではなく、「予想される」動作です)

その結果、私の id フィールドが増加し続けるため、より良い解決策は次の行に沿って何かを使用することです:

 INSERT INTO session(phpsessid, data) VALUES('{$id}', '{$data}')
     ON DUPLICATE KEY UPDATE data='{$data}'

これにより、外部キー制約が壊れて、データの整合性の問題が発生する可能性も回避できます。

于 2008-12-31T23:08:08.857 に答える