Mysqli declarações preparadas e substitua -se em
Pergunta
Eu tenho que seguir o código:
http://www.nomorepasting.com/getpaste.php?postaid=22987
Se PHPSESSID
já não está na tabela o REPLACE INTO
A consulta funciona muito bem, no entanto, se PHPSESSID
existe o chamado para executar é bem -sucedido, mas o sqlstate está definido como 'hy000' que não é muito útil e $_mysqli_session_write->errno
e$_mysqli_session_write->error
estão vazios e a coluna de dados não é atualizada.
Estou bastante certo de que o problema está no meu script em algum lugar, como executando manualmente o REPLACE INTO
de mysql funciona bem, independentemente de não ser o PHPSESSID
está na tabela.
Solução 3
Então, como se vê, há outros problemas com o uso de substituição que eu não estava ciente de:
Bug #10795: Substitua Reallocates Novo Auto_increment (Que de acordo com os comentários não é realmente um bug, mas o comportamento "esperado")
Como resultado, meu campo de identificação continua aumentando, de modo que a melhor solução é usar algo parecido com:
Inserir na sessão (phpsessid, dados) valores ('{$ id}', '{$ data}') na chave duplicada atualização de dados = '{$ data}'
Isso também impede que quaisquer restrições de chave estrangeira quebram e possíveis problemas de integridade de dados.
Outras dicas
Por que você está tentando fazer sua preparação na função aberta da sessão? Não acredito que a função de gravação seja chamada mais da que uma vez durante uma sessão; portanto, prepará -la no Open não faz muito para você, você também pode fazer isso na sua sessão.
De qualquer forma, acredito que você precisa de um espaço em branco após o nome da tabela e antes da lista de colunas. Sem o espaço em branco, acredito que o MySQL agiria como se você estivesse tentando chamar a função inexistente denominada sessão ().
REPLACE INTO session (phpsessid, data) VALUES(?, ?)
MySQL não vê diferença entre a contagem () 'e' contagem ()'
Interessante, quando eu corro o abaixo na CLI do MySQL, pareço obter um resultado diferente.
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)
"Substituir em" Executa 2 consultas: primeiro a "excluir" depois uma "inserção em". (Então, um novo Auto_increment é "por design")
Também estou usando o "Substituir em" para minhas sessões de banco de dados, mas estou usando o mysqli-> query () em combinação com o mysqli-> real_escape_string () em vez de um mysqli-> preparar ()