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.

Foi útil?

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 ()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top