mysqli ha preparato le istruzioni e SOSTITUISCI INTO

Devo seguire il codice:

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

Se PHPSESSID non è già nella tabella la query REPLACE INTO funziona correttamente, tuttavia se PHPSESSID esiste la chiamata per l'esecuzione riesce ma sqlstate è impostato su 'HY000' che non è molto utile e $ _mysqli_session_write-> errno e $ _mysqli_session_write-> errore sono entrambi vuoti e la colonna di dati non si aggiorna.

Sono abbastanza certo che il problema è nel mio script da qualche parte, poiché l'esecuzione manuale di REPLACE INTO da mysql funziona bene indipendentemente dal fatto che PHPSESSID non sia nella tabella.

Perché stai provando a fare la tua preparazione nella session di apertura? Non credo che la function di scrittura venga chiamata più di una volta durante una session, quindi prepararla all'apertura non fa molto per te, potresti farlo anche nella tua session di scrittura.

Ad each modo credo che tu abbia bisogno di qualche spazio dopo il nome della tabella, e prima dell'elenco delle colonne. Senza lo spazio bianco credo che mysql agirà come se tu stessi cercando di call la function inesistente chiamata session ().

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

MySQL non vede alcuna differenza tra "COUNT ( )" e "COUNT ( )"

Interessante, quando eseguo il sotto nella CLI mysql, mi sembra di get un risultato diverso.

 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) 

"REPLACE INTO" esegue 2 query: prima un "DELETE" quindi un "INSERT INTO". (Quindi un nuovo auto_increment è "By Design")

Sto anche usando "REPLACE INTO" per le mie sessioni di database, ma sto usando MySQLi-> query () in combinazione con MySQLI-> real_escape_string () invece di un MySQLi-> prepare ()

Quindi, come risulta che ci sono altri problemi con l'utilizzo di REPLACE di cui non ero a conoscenza:

Bug # 10795: REPLACE rialloca il nuovo AUTO_INCREMENT (che in base ai commenti non è in realtà un bug ma il comportmento "previsto")

Di conseguenza, il mio field ID continua ad aumentare, quindi la soluzione migliore è usare qualcosa come:

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

Ciò impedisce inoltre che eventuali vincoli di chiave esterna si interrompano e causino potenziali problemi di integrità dei dati.