Mehrere prepared Statements in einer Schleife

Spelmann

Erfahrenes Mitglied
Ich habe einer Schleife, in der ich ein XML-File auslese und die zugehörigen Datensätze einer DB aktualisiere. Nun möchte ich eine Funktion einbauen die es mir erlaubt, jene Datensätze der XML, die noch nicht in der DB erfasst sind, via INSERT nachzutragen.

So funktionierts aber nicht:
PHP:
$insert = $db_link->prepare('insert INTO tl_figur (nummer, name, size, gattung, sprache_rate, sprache_duktus) VALUES (?, ?, ?, ?, ?, ?)');
$update = $db_link->prepare('UPDATE tl_figur SET name=?, size=?, gattung=?, sprache_rate=?, sprache_duktus=? WHERE nummer=?');
$search = $db_link->prepare('SELECT count(*) FROM tl_figur where nummer=?');

foreach ( simplexml_load_file('./xml_sources/myXML.xml') as $elems ) {
        //Auslesen der XML-Knoten
        $nummer = (string)$elems->NUMMER;
        $name = (string)$elems->NAME;
        $size = (double)$elems->SIZE;
        $gattung = (string)$elems->GATTUNG;
        $sprache_rate = (string)$elems->SPRACHE->WORTRATE;
        $sprache_duktus = (string)$elems->SPRACHE->DUKTUS;

//Update (funktioniert hier nur, wenn ich den folgenden Abschnitt "Insert" auskommentiere)
        $update->bind_param('sdsssi', $name, $size, $gattung, $sprache_duktus, $sprache_rate, $nummer );
       $update->execute();
//Insert
        $search->bind_param("s", $nummer);
        $search->execute();
        if($search->fetch() == 0){
            $insert->bind_param('ssdsss', $nummer, $name, $size, $gattung, $sprache_rate, $sprache_duktus );
            $insert->execute();    
        }
}
Wenn ich den jeweiligen Datensatz der Schleife testenshalber mal manuell vergleiche gehts aber.
PHP:
//Insert
        if($nummer == "4711"){
            $insert->bind_param('ssdsss', $nummer, $name, $size, $gattung, $sprache_rate, $sprache_duktus );
            $insert->execute();    
        }
Also sind mehrere prepared Statements innerhalb einer Schleife scheinbar kein Problem.
Was mache ich falsch?
 
Zuletzt bearbeitet:
Hi,
zuerst einmal fehlt dir ein $update->execute();
Oh Danke, ist im Original aber enthalten und hier fälschlicherweise der Übersichtlichkeit zum Opfer gefallen. Hab's jetzt nachgetragen.

Manchmal hilft Try and Error
statt
PHP:
SELECT count(*) FROM tl_figur...
PHP:
SELECT * FROM tl_figur...
trotzdem behindern sich die Statements teilweise gegenseitig
 
Zuletzt bearbeitet von einem Moderator:
Die einzige Lösung bis jetzt: Für jedes Statement einen eigene Datenbankverbindung. Es läuft dann alles wie es soll, sieht aber irgendwie nicht gut aus :confused:
PHP:
require_once ('./db_connect/dbConfig.php');
$db_link1 = mysqli_connect (MYSQL_HOST,
                           MYSQL_BENUTZER,
                           MYSQL_KENNWORT,
                           MYSQL_DATENBANK);
$db_link2 = mysqli_connect (MYSQL_HOST,
                           MYSQL_BENUTZER,
                           MYSQL_KENNWORT,
                           MYSQL_DATENBANK);
$db_link3 = mysqli_connect (MYSQL_HOST,
                           MYSQL_BENUTZER,
                           MYSQL_KENNWORT,
                           MYSQL_DATENBANK);
PHP:
$insert = $db_link1->prepare('insert INTO tl_figur (nummer, name, size, gattung, sprache_rate, sprache_duktus) VALUES (?, ?, ?, ?, ?, ?)');
$update = $db_link2->prepare('UPDATE tl_figur SET name=?, size=?, gattung=?, sprache_rate=?, sprache_duktus=? WHERE nummer=?');
$search = $db_link3->prepare('SELECT * FROM tl_figur WHERE nummer=?');
Hat jetzt jemand eine Idee?
 

Neue Beiträge

Zurück