• Moderatore

    Usare in PHP l' ID auto_increment dopo l'insert con PDO

    Ciao a tutti,
    ho una tabella con 2 campi: 'id' intero con auto_increment come chiave primaria e un secondo campo di testo 'field'.
    Faccio un INSERT con PDO per aggiungere un record alla tabella MySql, una cosa così:

    
    $query = 'INSERT INTO table SET
                field = :field,
    $q = $pdo->prepare($query);
    $q->bindValue(':field', $_POST['field']);
    $q->execute();
    
    

    Il problema è che subito dopo mi serve in php l'id del record appena inserito: qual è il modo più efficiente per ottenerlo?
    Grazie.


  • Moderatore

    Aggiornamento. Ho trovato una soluzione alternativa ma non so se sia soddisfacente.
    Avevo provato fetchAll sopo l'execute per avere l'array:

    
    $query = 'INSERT INTO table SET
                field = :field,
    $q = $pdo->prepare($query);
    $q->bindValue(':field', $_POST['field']);
    $q->execute();
    $r = $s->fetchAll();
    
    

    Con l'INSERT fetchAll mi dava errore.
    Allora ho ottenuto l'id assegnato con l'auto_increment così:

    
    $query = 'INSERT INTO table SET
                field = :field,
    $q = $pdo->prepare($query);
    $q->bindValue(':field', $_POST['field']);
    $q->execute();
    $lastId = $pdo->lastInsertId();
    
    

    Funziona , ho soltanto un dubbio. L'applicazione può ricevere richieste multiple da client diversi: posso essere certo che l'ultimo id così trovato sia proprio quello inserito oppure sul database nel frattempo potrebbe essere stata eseguita un'altra operazione? Questo dovrebbe dipendere dalla $pdo (che è quella corrente, quindi il problema non dovrebbe esserci)... cosa ne pensate?


  • User Attivo

    non conosco bene PDO..se tu facessi delle normali query ti direi che il last sarebbe l'ultimo inserito da qualsiasi utente ma se la pdo li gestisce per utenti separati allora no..


  • Moderatore

    Ciao Pietro,
    grazie. L'oggetto $pdo è relativo alla connessione corrente al database, che viene richiamata con una include_once dal controller, quindi la $pdo che si trova nella function della query dovrebbe riferirsi a quella istanza e non ad un'altra. Questo è il ragionamento che ho fatto e che non so se sia esatto. :mmm:

    Il mio dubbio viene pure dal fatto che, per usare $pdo nella function della query di inserimento (e in altre function atte a fare altre operazioni), ho dichiarato nella function $pdo come globale. Posto un pezzo più ampio di codice per spiegare meglio:

    
    function storeDb() {
        global $pdo;
        try {
            $query = 'INSERT INTO table SET
                field = :field,
            $q = $pdo->prepare($query);
            $q->bindValue(':field', $_POST['field']);
            $q->execute();
            $lastId = $pdo->lastInsertId();
            return $lastId;
    // continua...
    
    

    La domanda è: $pdo può cambiare all'interno del blocco try tra la "lastInsert" e le istruzioni precedenti? Perché se così fosse avrei sbagliato approccio dichiarando global la $pdo.


  • User Attivo

  • Moderatore

    Ottimo Pietro, grazie. :smile5:
    PHP chiude la connessione al termine dello script e nella function io non la chiudo. L'unico problema poteva derivare da global $pdo, ma nella risposta che hai evidenziato viene detto che client diversi aprono connessioni diverse, quindi la $pdo non cambia.