Estou usando PDO para inserir um registro (mysql e php)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Existe uma maneira de saber se ele foi inserido com sucesso, por exemplo, se o registro não foi inserido porque era uma duplicata?
Editar: é claro que posso olhar o banco de dados, mas quero dizer feedback programático.
if ($stmt->execute()) { //true }
PDOStatement->execute()
ePDOStatement->errorCode()
totalmente consistentes um com o outro? Existe alguma circunstância em quePDOStatement->errorCode()
tem algo masPDOStatement->execute()
retorna verdadeiro? Ou quandoPDOStatement->execute()
retorna falso masPDOStatement->errorCode()
não tem nada?Dado que o modo de erro mais recomendado para PDO é
ERRMODE_EXCEPTION
, nenhumaexecute()
verificação de resultado direto funcionará . Pois a execução do código nem atingirá a condição oferecida nas outras respostas.Portanto, existem três cenários possíveis para lidar com o resultado da execução da consulta no PDO:
try..catch
operador.Para um usuário normal de PHP, parece um pouco estranho - que tal não verificar o resultado direto da operação? - mas é exatamente assim que as exceções funcionam - você verifica o erro em outro lugar. De uma vez por todas. Extremamente conveniente.
Então, em poucas palavras: em um código normal, você não precisa de nenhum tratamento de erros. Basta manter seu código como está:
Em caso de sucesso, ele dirá a você, em caso de erro, ele mostrará a página de erro normal que seu aplicativo está mostrando para tal ocasião.
Apenas no caso de você ter um cenário de tratamento diferente de apenas relatar o erro, coloque sua instrução insert em um
try..catch
operador, verifique se foi o erro que você esperava e trate-o; ou - se o erro for diferente - relançar a exceção, para possibilitar que seja tratada pela maneira usual de tratamento de erros em todo o site. Abaixo está o código de exemplo do meu artigo sobre tratamento de erros com PDO :No código acima, estamos verificando o erro específico para realizar alguma ação e lançando novamente a exceção para qualquer outro erro (nenhuma tabela, por exemplo) que será relatado a um programador.
Mais uma vez - apenas para dizer ao usuário algo como "Sua inserção foi bem-sucedida", nenhuma condição é necessária.
fonte
query()
função? Posso usar try-catch para emquery()
vez deprepared()->execute()
?Tente observar o valor de retorno de
execute
, que estáTRUE
no sucesso eFALSE
no fracasso.fonte
Se uma consulta de atualização for executada com valores que correspondem ao registro do banco de dados atual,
$stmt->rowCount()
ela retornará0
para nenhuma linha afetada. Se você tiver umif( rowCount() == 1 )
teste para testar o sucesso, pensará que a atualização falhou quando não falhou, mas os valores já estavam no banco de dados, então nada mudou.Isso não funcionou para mim quando tentei atualizar um registro com um campo de chave exclusivo que foi violado. A consulta retornou sucesso, mas outra consulta retorna o valor do campo antigo.
fonte
if($stmt->execute() && ($stmt->rowCount()>0))
Você pode testar o número de linhas
fonte
SELECT
consultas (e mesmo lá, a documentação fala sobre múltiplas consultas). Não diz nada sobreDELETE
,INSERT
ouUPDATE
, o que parece ser bom para o trabalho (a pergunta foi sobre umaINSERT
consulta). No entanto, sou novo no PDO e se eu estiver errado e alguém tiver outras referências, por favor, escreva-as aqui. Estou interessado em ver se existem desvantagens reais para os 3 comandos acima.Use id como chave primária com incremento automático
id incremental é sempre maior que zero mesmo no primeiro registro, então isso significa que sempre retornará um valor verdadeiro para id porque maior que zero significa verdadeiro em PHP
fonte
PDOStatement-> execute () pode lançar uma exceção
então o que você pode fazer é
fonte