php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.09.2010, 09:32  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard Unverständliches Problem mit PDO gelöst aber nicht ganz die ursache versta

Hallo zusammen,

habe gerade ein kleines verständnisproblem. Ich habe seit 2 Tagen mit folgender Fehlermeldung zu kämpfen gehabt:

Zitat:
General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
Diese wurde in function b() beim execute geworfen:

PHP-Code:
function a($data) {

    global 
$pdo;

    
$sql '
        UPDATE `a` SET `rgt`=`rgt`+2 WHERE `rgt` >= :lft;
        UPDATE `a` SET `lft`=`lft`+2 WHERE `lft` > :lft;
        INSERT INTO `a` (`name`, `lft`, `rgt`) VALUES (:name, :lft, :rgt);
    '
;
    
$prepared $pdo->prepare($sql);
    
$prepared->execute($data);
    
    return 
$pdo->lastInsertId();
}

function 
b($data) {

    global 
$pdo;

    
$sql '
        DELETE FROM `b` WHERE `ref_id`=:id;
    '
;
    
$prepared $pdo->prepare($sql);
    
$prepared->execute($data);
}

$id a($data);
b(array('id' => $id)); 
Nach ewigem rumkämpfen und herumprobieren habe ich herausgefunden dass $id immer string '0' von a() zurückbekommt. Also habe ich dort weitergeforscht und es lag wohl daran, dass ich in a() mehrere Befehle absetze. Das Problem habe ich jetzt so gelöst. indem ich für jeden Befehl (2x Update + 1x Insert) einen eigenen prepare/execute prozess starte:

PHP-Code:
function a($data1$data2) {

    global 
$pdo;

    
$sql1 'UPDATE `a` SET `rgt`=`rgt`+2 WHERE `rgt` >= :lft;';
    
$sql2 'UPDATE `a` SET `lft`=`lft`+2 WHERE `lft` > :lft;';
    
$sql3 'INSERT INTO `a` (`name`, `lft`, `rgt`) VALUES (:name, :lft, :rgt);';

    
$prepared $pdo->prepare($sql1);
    
$prepared $pdo->prepare($sql2);
    
$prepared $pdo->prepare($sql3);

    
$prepared->execute($data1);
    
$prepared->execute($data1);
    
$prepared->execute($data2);

    return 
$pdo->lastInsertId();
}

function 
b($data) {

    global 
$pdo;

    
$sql '
        DELETE FROM `b` WHERE `ref_id`=:id;
    '
;
    
$prepared $pdo->prepare($sql);
    
$prepared->execute($data);
}

$id a($data1$data2);
b(array('id' => $id)); 
Jetzt geht zwar alles wieder aber ich verstehe eben nicht das warum?

- Darf man nur einen befehl pro query absetzen?
- Lag mein fehler wo anders und es funktioniert jetzt nur weil ich den fehler zufällig/unbewusst bereinigt habe?
- Erscheint euch die fehlermeldung Logisch?
- Wieso kommt in der Fehlermeldung Zeile 24 und nicht Zeile 11?

Währe schön wenn jemand eine logische erklärung dafür hätte.

Schönen Gruß
Squall
Squall ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.09.2010, 10:27  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.631
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von Squall Beitrag anzeigen
- Darf man nur einen befehl pro query absetzen?
- Lag mein fehler wo anders und es funktioniert jetzt nur weil ich den fehler zufällig/unbewusst bereinigt habe?
- Erscheint euch die fehlermeldung Logisch?
- Wieso kommt in der Fehlermeldung Zeile 24 und nicht Zeile 11?
- Darf man nur einen befehl pro query absetzen?
Du kannst mehrere Queries ausführen.

- Lag mein fehler wo anders und es funktioniert jetzt nur weil ich den fehler zufällig/unbewusst bereinigt habe?
Der Fehler lag in der Ausführung mehrer Queries und dem nicht-Abfangen aller Rückgabewerte

- Erscheint euch die fehlermeldung Logisch?
Ja. 3 Queries -> 0 Ergebnisse abgefragt, d.h. die hängen da noch irgendwo in der Luft. Soll MySQL die einfahc beim nächsten Befehl verwerfen/löschen?

- Wieso kommt in der Fehlermeldung Zeile 24 und nicht Zeile 11?
In deiner geposteten Fehlermeldung ist keine Zeilenangabe zu finden.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 24.09.2010, 10:42  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Dark Guardian Beitrag anzeigen
- Darf man nur einen befehl pro query absetzen?
Du kannst mehrere Queries ausführen.
Danke

Zitat:
Zitat von Dark Guardian Beitrag anzeigen
- Lag mein fehler wo anders und es funktioniert jetzt nur weil ich den fehler zufällig/unbewusst bereinigt habe?
Der Fehler lag in der Ausführung mehrer Queries und dem nicht-Abfangen aller Rückgabewerte
Komme ich später vielleicht nochmal darauf zurück

Zitat:
Zitat von Dark Guardian Beitrag anzeigen
- Erscheint euch die fehlermeldung Logisch?
Ja. 3 Queries -> 0 Ergebnisse abgefragt, d.h. die hängen da noch irgendwo in der Luft. Soll MySQL die einfahc beim nächsten Befehl verwerfen/löschen?
Ja, die sollen verworfen/gelöscht werden. Gibt es dafür eine Funktion oder Parameter?

Zitat:
Zitat von Dark Guardian Beitrag anzeigen
- Wieso kommt in der Fehlermeldung Zeile 24 und nicht Zeile 11?
In deiner geposteten Fehlermeldung ist keine Zeilenangabe zu finden.
PHP-Code:
1    function a($data) {
2
3        
global $pdo;
4
5        $sql 
'
6            UPDATE `a` SET `rgt`=`rgt`+2 WHERE `rgt` >= :lft;
7            UPDATE `a` SET `lft`=`lft`+2 WHERE `lft` > :lft;
8            INSERT INTO `a` (`name`, `lft`, `rgt`) VALUES (:name, :lft, :rgt);
9        '
;
10        $prepared $pdo->prepare($sql);
11        $prepared->execute($data);
12        
13        
return $pdo->lastInsertId();
14    }
15
16    
function b($data) {
17
18        
global $pdo;
19
20        $sql 
'
21            DELETE FROM `b` WHERE `ref_id`=:id;
22        '
;
23        $prepared $pdo->prepare($sql);
24        $prepared->execute($data);
25    }
26
27    $id 
a($data);
28    b(array('id' => $id)); 
Squall ist offline   Mit Zitat antworten
Alt 24.09.2010, 10:51  
Erfahrener Benutzer
 
Registriert seit: 17.08.2010
Beiträge: 216
PHP-Kenntnisse:
Fortgeschritten
Dormilich befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Squall Beitrag anzeigen
Ja, die sollen verworfen/gelöscht werden. Gibt es dafür eine Funktion oder Parameter?
PDOStatement->closeCursor()
Dormilich ist offline   Mit Zitat antworten
Alt 24.09.2010, 10:53  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.631
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von Squall Beitrag anzeigen
Ja, die sollen verworfen/gelöscht werden. Gibt es dafür eine Funktion oder Parameter?
Wie in der Fehlermeldung beschrieben PDO auf Buffered Queries umstellen. Dann sendet MySQL direkt alle Ergebnisse an PHP und hat wieder "Platz" für neues. Ob PHP diese dann verarbeitet ist MySQL dann egal.

http://phpperformance.de/gepufferter...ysql-tabellen/

Die Fehlermeldung kommt erst beim DELETE-Befehl weil MySQL wartet bis alle Ergebnisse der vorhergeggangen Befehle abgefragt wurden. Beim nächsten Query geht es dann nicht weiter weil noch nicht alle Ergebnisse abgerufen worden sind d.h. der Fehler tritt erst bei diesem Query auf.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 24.09.2010, 11:54  
Erfahrener Benutzer
 
Registriert seit: 30.07.2008
Beiträge: 1.167
PHP-Kenntnisse:
Fortgeschritten
xm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphärexm22 sorgt für eine eindrucksvolle Atmosphäre
Standard

Das kommt u. a. von so was:
Zitat:
global $pdo;
xm22 ist offline   Mit Zitat antworten
Alt 24.09.2010, 11:59  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

Und da ist der punkt den ich nicht verstehe, da ich folgendes PDO Objekt verwende
PHP-Code:
        $dbOptions = array(
            
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            
PDO::ATTR_PERSISTENT => true,
            
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
            
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
        
);

        
$db = new PDO('mysql:host=localhost;dbname=' DB_DATABASE_NAMEDB_USER_NAMEDB_USER_PASSWORD$dbOptions);
        
$db->query('SET NAMES utf8'); 
und selbst das umstellen auf:
PHP-Code:
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false 
keine erlösung gebracht hat

@xm22
Was meinst du? Mit global mache ich doch nur die variable in der funktion verwendbar.
Squall ist offline   Mit Zitat antworten
Alt 24.09.2010, 12:03  
Erfahrener Benutzer
 
Registriert seit: 17.08.2010
Beiträge: 216
PHP-Kenntnisse:
Fortgeschritten
Dormilich befindet sich auf einem aufstrebenden Ast
Standard

global ist aber generell schlechter Stil (weil du keine Kontrolle mehr darüber hast).

übrigens set names utf8 kann man auch als option übergeben:
PHP-Code:
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'" 
Dormilich ist offline   Mit Zitat antworten
Alt 24.09.2010, 12:26  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.631
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Zitat:
Zitat von Squall Beitrag anzeigen
Und da ist der punkt den ich nicht verstehe, da ich folgendes PDO Objekt verwende
PHP-Code:
        $dbOptions = array(
            
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            
PDO::ATTR_PERSISTENT => true,
            
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
            
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
        
);

        
$db = new PDO('mysql:host=localhost;dbname=' DB_DATABASE_NAMEDB_USER_NAMEDB_USER_PASSWORD$dbOptions);
        
$db->query('SET NAMES utf8'); 
und selbst das umstellen auf:
Das hättest du mal früher sagen sollen das du bereits buffered Queries eingestellt hast...

Was gibt denn fetchAll() nach deinen 3er Befehlen zurück? Denn

Zitat:
ich herausgefunden dass $id immer string '0' von a() zurückbekommt
Das Problem besteht ja ebenfalls.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist offline   Mit Zitat antworten
Alt 24.09.2010, 12:56  
Erfahrener Benutzer
 
Benutzerbild von Squall
 
Registriert seit: 19.03.2009
Beiträge: 539
PHP-Kenntnisse:
Fortgeschritten
Squall befindet sich auf einem aufstrebenden Ast
Standard

@Dormilch
Danke für den Tipp mit utf-8. Und dass mit den globals ist ein anderes Thema.

Zum Thema:
Zitat:
Was gibt denn fetchAll() nach deinen 3er Befehlen zurück?
Naja, dass sagt leider noch weniger als garnichts aus:
Zitat:
SQLSTATE[HY000]: General error
Squall ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] PDO prepare Problem in einer Klasse da.eXecutoR PHP Tipps 2010 4 11.07.2010 18:07
Problem mit PDO dennito PHP Tipps 2010 2 23.06.2010 14:06
[Erledigt] PDO: Allgmeine Fragen, Zeit messen christophM Datenbanken 2 19.05.2009 23:12
[Erledigt] PDO Problem mit preparedStatements Hurricane PHP-Fortgeschrittene 1 20.02.2009 15:35
[Erledigt] Problem mit PDO und Firebird DB Stoggy Datenbanken 3 10.02.2009 11:04
Problem: User gelöscht, nun Forum kaputt. Impidimpi Off-Topic Diskussionen 14 05.01.2009 20:10
PDO Problem webbies PHP-Fortgeschrittene 4 17.12.2008 11:16
Problem mit swfobjects R4v3r JavaScript, Ajax und mehr 8 21.09.2008 14:17
Tabelle mit px Angaben - Problem mit IE//edit: prob gelöst möchtegernchegga HTML, Usability und Barrierefreiheit 8 09.12.2005 15:08
selbst gelöst! Select <option> kleines Problem Dropdow 24bits PHP Tipps 2005-2 0 15.10.2005 19:19
Cookie / localhost / Problem gelöst PHP-Fortgeschrittene 11 02.11.2004 22:41
Problem, hoffe die Fehlermeldung falsch verstanden zu haben Off-Topic Diskussionen 18 08.08.2004 16:39

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
pdostatement::lastinsertid(), pdo::mysql_attr_use_buffered_query, pdo löschen, pdo update funktioniert nicht, pdo prepare delete from, pdo firebird lastinsertid, php pdo mysql buffered insertion, php pdo global, http://www.php.de/php-fortgeschrittene/72173-unverstaendliches-problem-mit-pdo-geloest-aber-nicht-ganz-die-ursache-versta.html, pdo update, select * from site where lft <=8 and rgt >= 9, php pdo mehrere, pdo delete php, pdo delete geht nicht, lastinsertid mysql pdo returns 0 string, pdo firebird error prepare false, pdo funktion, pdo::execute insert funktioniert nicht, pdostatement lastinsertid, php pdo execute fehler auslesen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum