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

4

How to ask $Produtos if the insertion was made or if there was an error in insertion attempt type 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')
    ));
    
asked by anonymous 16.11.2014 / 00:48

3 answers

10

execute returns false if the operation fails. You can also get additional information about the error with 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 quotation marks in the array's key names (works without a PHP peculiarity but is not correct)     

16.11.2014 / 01:09
7

Ideally, you should use the PDO Object Oriented model for errors as well, by taking the PDOException triggers when any errors occur: / p>

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 ... It has a small drawback. By default, PDO prefers to remain quiet about errors without reporting them, even if their error alerts are enabled and level enough for errors to be reported.

So, for her to shout to the four winds when anything hurt her, you should set up the connection object, once it's created:

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

$dbh -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    
16.11.2014 / 01:30
0

You can do the following:

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!";
    }
    
16.11.2014 / 01:55