How to ask the PDO if the insertion was made or error?

Asked

Viewed 1,592 times

4

How to ask the $Produtos if the insertion was made or if there was an error in the insertion attempt or die of mysql?

    if(isset($_POST['cadastra_produtos'])){
    ///////////////////////////////////

    $Produtos = $pdo->prepare("INSERT INTO tbl_produtos VALUES 
    (NULL, :prod_nome, :prod_categoria, :prod_dimens, :prod_qtde, :prod_valor, :prod_descr, :prod_data)");

    $Produtos->execute(array(
        prod_nome       => strip_tags($_POST['prod_nome']), 
        prod_categoria  => strip_tags($_POST['prod_categoria']),    
        prod_dimens     => strip_tags($_POST['prod_dimens']),   
        prod_qtde       => strip_tags($_POST['prod_valor']),    
        prod_valor      => strip_tags($_POST['prod_valor']),    
        prod_descr      => strip_tags($_POST['prod_descr']),    
        prod_data       => date('Y-m-d H:i:s')
    ));

4 answers

11


The execute returns false if the operation fails. You can also get additional information about the error with the errorInfo:

$Produtos = $pdo->prepare("INSERT INTO tbl_produtos VALUES 
(NULL, :prod_nome, :prod_categoria, :prod_dimens, :prod_qtde, :prod_valor, :prod_descr, :prod_data)");

$ok = $Produtos->execute(array(
    'prod_nome'       => strip_tags($_POST['prod_nome']), 
    'prod_categoria'  => strip_tags($_POST['prod_categoria']),    
    'prod_dimens'     => strip_tags($_POST['prod_dimens']),   
    'prod_qtde'       => strip_tags($_POST['prod_valor']),    
    'prod_valor'      => strip_tags($_POST['prod_valor']),    
    'prod_descr'      => strip_tags($_POST['prod_descr']),    
    'prod_data'       => date('Y-m-d H:i:s')
));

if(!$ok) {
    print_r($Produtos->errorInfo());
}

PS: Use quotes in the array key names (works without a PHP feature, but is not correct)

7

The ideal is to use the PDO’s Object-Oriented model also for errors, taking the Pdoexception fired when any error occurs:

try {

    $stmt = $conn -> prepare( /* ... */ );

    try {

        $stmt -> execute();

    } catch( PDOException $e ) {

        // Statement não foi executado
    }

} catch( PDOException $e ) {

    // Statement não preparado

    echo $e -> getMessage();
}

But... there’s one small inconvenience. By default PDO prefers to remain quiet about errors, without reporting them, even if their error alerts are enabled and at a level sufficient for errors to be reported.

So in order for it to shout out to the four winds when anything hurts it, you must set up the connection object, once created:

$dbh = new PDO( /* ... */ );

$dbh -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

0

Here’s what you can do:

if(isset($_POST['cadastra_produtos'])){
    ///////////////////////////////////

    $Produtos = $pdo->prepare("INSERT INTO tbl_produtos VALUES 
    (NULL, :prod_nome, :prod_categoria, :prod_dimens, :prod_qtde, :prod_valor, :prod_descr, :prod_data)");

    if($Produtos->execute(array(
        prod_nome       => strip_tags($_POST['prod_nome']), 
        prod_categoria  => strip_tags($_POST['prod_categoria']),    
        prod_dimens     => strip_tags($_POST['prod_dimens']),   
        prod_qtde       => strip_tags($_POST['prod_valor']),    
        prod_valor      => strip_tags($_POST['prod_valor']),    
        prod_descr      => strip_tags($_POST['prod_descr']),    
        prod_data       => date('Y-m-d H:i:s')
    ))){

        if($Produtos->rowCount() > 0){
           echo "inserido com sucesso";
        }else{
           echo "ocorreu um erro!";
        }

    }else{
        echo "ocorreu um erro!";
    }
  • 3

    Consider giving an explanation of what your example does, an inexperienced user will copy your code and continue not knowing what happens. Besides firing a undefined constant prod_nome.

-1

Only use this after running it():

$stmt->execute();

$foo_arr = $stmt->errorInfo();

print_r($foo_arr);

Browser other questions tagged

You are not signed in. Login or sign up in order to post.