Esercizio PDO

bismark2005

Utente Attivo
8 Mar 2011
70
0
0
Dove il seguente esercizio è sbagliato?

PHP:
<?php
try{
    $dbh= new PDO("mysql:host=localhost; dbname=prova","bismark","bismark");
    //Prepariamo la query con il metodo prepare()
            $st=$dbh->prepare("INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES(:id,:nome,:cognome,:nascita)");
                       
            $st->bindParam(':id', $id);
            $st->bindParam(':nome',$nome);
            $st->bindParam(':cognome',$cognome);   
            $st->bindParam(':nascita',$nascita);
           
//Inserisco la prima riga
           
$id=1;
$nome='Nome1';
$cognome='Cognome1';
$nascita=1980;


   
}catch(PDOException $e)
{
    echo 'Errore: ' . $e->getMessage();
}
           
?>
 
Ultima modifica di un moderatore:
ciao
sto anch'io studiando la pdo, quindi può essere che sbagli, ma mi sembra che dopo
$id=1;
$nome='Nome1';
$cognome='Cognome1';
$nascita=1980;
manchi
$st->execute();
 
Inoltre tu dichiari i parametri da inserire dopo

PHP:
$id=1;
$nome='Nome1';
$cognome='Cognome1';
$nascita=1980;
$st->bindParam(':id', $id);
$st->bindParam(':nome',$nome);
$st->bindParam(':cognome',$cognome);   
$st->bindParam(':nascita',$nascita);
$st->execute();
 
Andando per logica o almeno per come lo utilizzo di solito mi è sembrato strano che chiamasse le funzioni prima che siano settate le variabili da passare invece ora ho visto che in bindParam() la variabile è passata tramite referenza quindi si, si puo fare anche cosi al contrario di bindValue() che invece passa direttamente il valore senza referenza quindi nel caso non sia settata genera un notice, direi buono a sapersi
 
Ultima modifica:
Se scrivo il codice in questa maniera:

Codice:
$id=1;
            $nome='Nome1';
            $cognome='Cognome1';
            $nascita=1980;
            
            $st->bindParam(':id', $id);            
            $st->bindParam(':nome',$nome);
            $st->bindParam(':cognome',$cognome);   
            $st->bindParam(':nascita',$nascita);
            $st->execute();

funziona. Quindi i valori vanno dichiarati prima di bindparam e poi dopo bindparam deve essere chiamato il metodo execute()

@borgo italia: Guarda anche io sto studiando Php da poco. Anzi...fino a qualche mese fa credevo che il db fosse un panino da mangiare. In poco tempo mi sono ritrovato ad avere a che fare con i concetti dell'O.O. e poi PDO, ORM MVC ecc ecc. La cosa comica è che facendo alcune domande ad un programmatore Php su questi argomenti, mi ha detto...ma stai studiando gli argomenti avanzati del php? Sembra che in azienda dove lavora non sanno nemmeno cosa sia l'ORM. Ora capisco perchè Php ha un brutto nome.
 
Ultima modifica:
Se scrivo il codice in questa maniera:

Codice:
$id=1;
            $nome='Nome1';
            $cognome='Cognome1';
            $nascita=1980;
            
            $st->bindParam(':id', $id);            
            $st->bindParam(':nome',$nome);
            $st->bindParam(':cognome',$cognome);   
            $st->bindParam(':nascita',$nascita);
            $st->execute();

funziona. Quindi i valori vanno dichiarati prima di bindparam e poi dopo bindparam deve essere chiamato il metodo execute()
Come postato sopra, puoi anche metterli dopo dato che vengono passati tramite referenza e non vengono valutati fino all'execute()
 
Come postato sopra, puoi anche metterli dopo dato che vengono passati tramite referenza e non vengono valutati fino all'execute()

Se metto le variabili dopo il bind mi segnala un errore sull'IDE. In particolare dice che le variabili non sono inizializzate. Quindi vanno messe prima del bindParam
 
Il codice è inutilmente complicato e fa un uso sbagliato dei blocchi try/catch:
PHP:
<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=prova', 'bismark', 'bismark');
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}

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

$stm = $dbh->prepare('INSERT INTO anagrafica (id, nome, cognome, nascita) VALUES (:id, :nome, :cognome, :nascita)');

try {
    $stm->execute(array(
        ':id'      => 1,
        ':nome'    => 'Nome1',
        ':cognome' => 'Cognome1',
        ':nascita' => 1980,
    ));
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}
 
Il codice è inutilmente complicato e fa un uso sbagliato dei blocchi try/catch:
PHP:
<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=prova', 'bismark', 'bismark');
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}

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

$stm = $dbh->prepare('INSERT INTO anagrafica (id, nome, cognome, nascita) VALUES (:id, :nome, :cognome, :nascita)');

try {
    $stm->execute(array(
        ':id'      => 1,
        ':nome'    => 'Nome1',
        ':cognome' => 'Cognome1',
        ':nascita' => 1980,
    ));
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}

Conosci qualche guida chiara sul PDO in Php. Ogni nuova guida che leggo mi confonde sempre di più le idee
 
Il codice è inutilmente complicato e fa un uso sbagliato dei blocchi try/catch:
PHP:
<?php
try {
    $dbh = new PDO('mysql:host=localhost;dbname=prova', 'bismark', 'bismark');
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}

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

$stm = $dbh->prepare('INSERT INTO anagrafica (id, nome, cognome, nascita) VALUES (:id, :nome, :cognome, :nascita)');

try {
    $stm->execute(array(
        ':id'      => 1,
        ':nome'    => 'Nome1',
        ':cognome' => 'Cognome1',
        ':nascita' => 1980,
    ));
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}

Comunque venendo a noi. Nel codice che hai scritto...

Anzitutto ti sei connesso al db mettendo l'istruzione in un blocco Try/catch. Poi hai impostato l'attributo a PDO::ATTR_ERRMODE al valore PDO::ERRMODE_EXCEPTION

Poi hai preparato la query con il metodo prepare, ed infine l'hai eseguita con execute. Se è giusto, come si fa ad inserire più di un valore nel db?

Ps: Però hai saltato il metodo BindParam()
 
Ultima modifica:
Questo codice funziona:

Codice:
<?php

//Connessione al db con PDO

try{
    $objPDO=new PDO ('mysql:host=localhost;dbname=anagrafica','fabio','fabio');
    echo 'Connessione avvenuta con successo...';
    $objstatement1=$objPDO->query("INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (1,'Nome1','Cognome1',1975)");
    $objstatement2=$objPDO->query("INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (2,'Nome2','Cognome2',1974)");
    $objstatement3=$objPDO->query("INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (3,'Nome3','Cognome3',1980)");
    $objstatement4=$objPDO->query("INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (4,'Nome4','Cognome4',1985)");
    
    print 'Inserimento nel db avvenuto con successo...';
    
    }catch (PDOException $e){
        print 'Errore '. $e->getMessage();
    }


?>

Ho solo un dubbio. Come faccio ad inserire in un unica istruzione più valori nel db invece di scriverne 4?
 
Come faresti da normale query
PHP:
    $objstatement1=$objPDO->query("
        INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (1,'Nome1','Cognome1',1975);
        INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (2,'Nome2','Cognome2',1974);
        INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (3,'Nome3','Cognome3',1980);
        INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES (4,'Nome4','Cognome4',1985)
        ");
 
Usa i prepared statement e inserisci una sola serie di istruzioni collegate tra loro in un blocco try/catch:
PHP:
<?php
try {
    $dbh = new PDO ('mysql:host=localhost;dbname=anagrafica','fabio','fabio');
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}

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

$stm = $dbh->prepare('INSERT INTO anagrafica (nome, cognome, nascita) VALUES (?, ?, ?)');

try {
    $dbh->execute(array('Nome1', 'Cognome1', 1975));
    $dbh->execute(array('Nome2', 'Cognome2', 1974));
    $dbh->execute(array('Nome3', 'Cognome3', 1980));
    $dbh->execute(array('Nome4', 'Cognome4', 1985));
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}
?>
Mentre se vuoi eseguire tutto in un'unica query:
PHP:
<?php
try {
    $dbh = new PDO ('mysql:host=localhost;dbname=anagrafica','fabio','fabio');
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}

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

$stm = $dbh->prepare('INSERT INTO anagrafica (nome, cognome, nascita) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?), (?, ?, ?)');

try {
    $dbh->execute(array(
        'Nome1', 'Cognome1', 1975,
        'Nome2', 'Cognome2', 1974,
        'Nome3', 'Cognome3', 1980,
        'Nome4', 'Cognome4', 1985
    ));
} catch (PDOException $e) {
    die('Errore: ' . $e->getMessage());
}
?>
Ma non è consigliato, perché non è il modo corretto di usare i prepared statement e non aumenta nemmeno granché la velocità di esecuzione (se ho tempo faccio dei test più approfonditi).
 
Grazie Alessandro, ma al momento cerco di connettermi usando "solo" query e exec. Ho scritto il seguente codice:

PHP:
<?php

//Connessione al db con PDO

try{
    $objPDO=new PDO ('mysql:host=localhost;dbname=prova','username','password');
    echo 'Connessione avvenuta con successo...';
    $objstatement=$objPDO->query("INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES 
        (1,'Nome1','Cognome1',1975),
        (2,'Nome2','Cognome2',1980),
        (3,'Nome3','Cognome3',1985),
        (4,'Nome4','Cognome4',1986),
        (5,'Nome5','Cognome5',1987");
        
    print 'Inserimento nel db avvenuto con successo...';
    
    }catch (PDOException $e){
        print 'Errore '. $e->getMessage();
    }


?>

sembra tutto ok, ma non inserisce i valori nel db. Dove sbaglio?
 
Ultima modifica di un moderatore:
Grazie Alessandro, ma al momento cerco di connettermi usando "solo" query e exec. Ho scritto il seguente codice:

PHP:
<?php

//Connessione al db con PDO

try{
    $objPDO=new PDO ('mysql:host=localhost;dbname=prova','username','password');
    echo 'Connessione avvenuta con successo...';
    $objstatement=$objPDO->query("INSERT INTO anagrafica(id,nome,cognome,nascita)VALUES 
        (1,'Nome1','Cognome1',1975),
        (2,'Nome2','Cognome2',1980),
        (3,'Nome3','Cognome3',1985),
        (4,'Nome4','Cognome4',1986),
        (5,'Nome5','Cognome5',1987");
        
    print 'Inserimento nel db avvenuto con successo...';
    
    }catch (PDOException $e){
        print 'Errore '. $e->getMessage();
    }


?>

sembra tutto ok, ma non inserisce i valori nel db. Dove sbaglio?
Ti sei scordato di chiudere una tonda alla fine
Codice:
(5,'Nome5','Cognome5',1987)
 
Invece il seguente codice non restituisce nessun valore dal db, quando lo eseguo esce una pagina bianca. Eppure non mi segna nessun errore nell'ide.

PHP:
<?php
try {
    
    $objPDO=newPDO('mysql:host=localhost; dbname=prova','user','password');
    $objPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $nascita=2000;
    $objStatement=$objPDO->prepare('SELET * FROM anagrafica WHERE nascita <= :nascita');
    $objStatement->bindParam(':nascita',$nascita);
    
    $objStatement->execute();
    while($arRow=$objStatement->fetch(PDO::FETCH_ASSOC)){
        print_r ($arRow);
            
        }
    }catch(PDOException $e)
    {
        print'Errore' .$e->getMessage;
    }

{
    
}

?>
 
Ultima modifica di un moderatore:
Invece il seguente codice non restituisce nessun valore dal db, quando lo eseguo esce una pagina bianca. Eppure non mi segna nessun errore nell'ide.

PHP:
<?php
try {
    
    $objPDO=newPDO('mysql:host=localhost; dbname=prova','user','password');
    $objPDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $nascita=2000;
    $objStatement=$objPDO->prepare('SELET * FROM anagrafica WHERE nascita <= :nascita');
    $objStatement->bindParam(':nascita',$nascita);
    
    $objStatement->execute();
    while($arRow=$objStatement->fetch(PDO::FETCH_ASSOC)){
        print_r ($arRow);
            
        }
    }catch(PDOException $e)
    {
        print'Errore' .$e->getMessage;
    }

{
    
}

?>
Distanzia new PDO(), metti le tonde a $e->getMessage() non è un attributo ma un metodo inoltre nella query correggi SELET con SELECT
 

Discussioni simili