php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 21-06-2011, 17:05
culturo
 Registrierter Benutzer
Links : Onlinestatus : culturo ist offline
Registriert seit: Jun 2011
Ort: Asia
Beiträge: 5
culturo befindet sich auf einem aufstrebenden Ast
Standard Prepared Statements und bind_result mit wechselnder Anzahl von Parametern

Ich möchte mir ein Modul schreiben, dass ich in bei allen meinen Seiten verwenden kann. Dieses Modul soll alle Datenbankzugriffe organisieren (PHP/MySQL).

So weit, so einfach. Leider spricht der Vorteil von Prepared Statements, dass sie nicht manipulierbar sein sollen, gegen dieses Vorhaben.

Bisher binde ich die results so:

$GLOBALS['db_obj']->bind_result($GLOBALS['foo'], $GLOBALS['bar'], $GLOBALS['baz']);

Aber da natürlich die Anzahl meiner Parameter variiert, muss ich das jetzt irgendwie umgehen. Also hab ich Google bemüht und dabei call_user_func_array gefunden.

Zu meiner Schande muss ich gestehen, dass ich überhaupt nicht verstehe, was da genau passiert. Das geht so weit, dass ich nicht mal weiß, wo ich anfangen soll.

Ich hab ja schon mit function() gearbeitet. Aber mir ist überhaupt nicht klar, was ich mit einer Funktion machen soll, was nicht auch mit einer While-Schleife funktionieren müsste. Was es aber natürlich nicht tut.

So wie ich das sehe ist der Hauptunterschied zwischen function() und call_user_func_array() der, dass das eine mehrere Variablen und das andere ein Array mit den zu verarbeitenden Daten erhält. Aber wieso kann das jetzt mein Problem lösen?

Danke für jede Art Verständnishilfe.
Mit Zitat antworten
  #2 (permalink)  
Alt 21-06-2011, 18:14
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

So ungefähr ab hier ist der Post für mich nicht mehr nachvollziehbar:

Zitat:
Bisher binde ich die results so:

$GLOBALS['db_obj']->bind_result($GLOBALS['foo'], $GLOBALS['bar'], $GLOBALS['baz']);

Aber da natürlich die Anzahl meiner Parameter variiert, muss ich das jetzt irgendwie umgehen.
Dein $GLOBALS['db_obj'] ist ein MySQLi_STMT, nehme ich an?

Wie sollen da denn die Parameter variieren? Und wenn sie variieren, wieso übergibst du dann nicht einfach mehr Argumente an die Methode?
Mit Zitat antworten
  #3 (permalink)  
Alt 21-06-2011, 18:16
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo und willkommen im Forum,

zunächst mal finde ich es bedenklich, mit $GLOBALS zu arbeiten. Damit schaffst du dir eine unübersichtliche Landschaft von wilden Variablen. Darin liegt z. B. schon einer der Vorteile von Funktionen, dass ihre Variablen nur dort gelten und Namenskollisionen ausgeschlossen sind.

Dein $db_obj ist eigentlich keins, sondern offensichtlich ein MySQLi_Stmt. Da ein solches nur eine ganz bestimmte Abfrage repräsentiert, kann es eigentlich gar nicht sein, dass du dort unterschiedliche Parameteranzahlen hast.

Wenn du allerdings meinst, dass du ein Codestück für völlig unterschiedliche Statements verwendest, dann verstehe ich es, aber mir leuchtet dabei nicht ein, wei du das ohne Funktionen bewerkstelligen willst (die ja jeweils einen eigenen Gültigkeitsbereich für jeden Aufruf haben).

Zum Thema call_user_func_array: Damit kann man Parameterlisten für Funktionen dynamisch zusammenbauen, statt die Parameter fest in den Aufruf einzubauen.

PHP-Code:
myFunc($a$b$c); // Es werden 3 Parameter übergeben
myFunc($d$e); // Es werden 2 Parameter übergeben

$params = array(); // dynamische Parameter; können unterschiedlich viele sein
$params[] = 1;
$params[] = "Hallo Welt!";
$params[] = false;
myFunc($params); // FALSCH, denn jetzt wird nur ein Parameter (ein Array) übergeben

// Lösung:
call_user_func_array("myFunc"$params); // jedes Element wird sozusagen als einzelner Parameter übergeben

// Das kann man sich ungefähr so vorstellen:
switch (count($params)) {
    case 
0myFunc(); break;
    case 
1myFunc($params[0]); break;
    case 
2myFunc($params[0], $params[1]); break;
    case 
3myFunc($params[0], $params[1], $params[2]); break;
    case 
4myFunc($params[0], $params[1], $params[2], $params[3]); break;
    
// u. s. w.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #4 (permalink)  
Alt 21-06-2011, 18:56
culturo
 Registrierter Benutzer
Links : Onlinestatus : culturo ist offline
Registriert seit: Jun 2011
Ort: Asia
Beiträge: 5
culturo befindet sich auf einem aufstrebenden Ast
Standard

So hab ich das bisher gemacht:

PHP-Code:
if ($GLOBALS['db_obj']=$GLOBALS['db']->prepare($GLOBALS['db_sql_stm'])) {
    
$GLOBALS['db_obj']->execute();
    
$GLOBALS['db_obj']->bind_result($GLOBALS['foo'], $GLOBALS['bar'], $GLOBALS['baz']);
    
$GLOBALS['cou_ds']=0;
    while (
$GLOBALS['db_obj']->fetch()) {
        
$GLOBALS['pag'][$GLOBALS['cou_ds']]['pag_id']=$GLOBALS['pag_id'];
        
$GLOBALS['pag'][$GLOBALS['cou_ds']]['foo']=$GLOBALS['foo'];
        
$GLOBALS['pag'][$GLOBALS['cou_ds']]['bar']=$GLOBALS['bar'];
        
$GLOBALS['pag'][$GLOBALS['cou_ds']]['baz']=$GLOBALS['baz'];
        
$GLOBALS['cou_ds']++;
    }
    
$GLOBALS['db_obj']->close();
} else {
    
$GLOBALS['err_db']='Error '.$GLOBALS['db']->errno.' - '.$GLOBALS['db']->error;
    echo 
'<br>'.$GLOBALS['err_db'].'<br>';

Okay, das mit der Gültigkeit der Variablen nur innerhalb der Funktion hatte ich schon wieder vergessen.

Genau, ich möchte ein Modul für alle Statements verwenden. Und ich will lieber eine Funktion verwenden als ein switch/case-Konstrukt.

Aber, ich will es halt verstehen. Leider verwirrt mich auch Dein Beispiel, Amica. Sorry, aber bei diesem call_user_func_array hab ich das Gefühl, als sehe ich den Wald vor lauter Bäumen nicht.

Wenn das Funktionen sein sollen, dann fehlt der Ausdruck "function", oder? Und auch irgendwas, was dem dem Objekt sagt, was damit geschehen zu hat. Oder liege ich völlig falsch?

PHP-Code:
myFunc($a$b$c); // Es werden 3 Parameter übergeben
myFunc($d$e); // Es werden 2 Parameter übergeben 
Das is klar, hier setzt Du ein Array.

PHP-Code:
$params = array(); // dynamische Parameter; können unterschiedlich viele sein
$params[] = 1;
$params[] = "Hallo Welt!";
$params[] = false
Das sagt mir wieder nix:

PHP-Code:
myFunc($params); // FALSCH, denn jetzt wird nur ein Parameter (ein Array) übergeben 
Okay, damit könnte ich was anfangen, wenn ich nicht 2 unterschiedliche myFunc hätte und darin etwas mehr stünde.

PHP-Code:
// Lösung:
call_user_func_array("myFunc"$params); // jedes Element wird sozusagen als einzelner Parameter übergeben 
Das will ich nicht:

PHP-Code:
// Das kann man sich ungefähr so vorstellen:
switch (count($params)) {
    case 
1myFunc($params[0]); break;
    case 
2myFunc($params[0], $params[1]); break;
    case 
3myFunc($params[0], $params[1], $params[2]); break;
    case 
4myFunc($params[0], $params[1], $params[2], $params[3]); break;
    
// u. s. w.

Sorry, wenn ich Euch Eure Zeit stehle, mit meinem Unverständnis.

Geändert von culturo (21-06-2011 um 19:01 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 21-06-2011, 19:20
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Also ich sehe bei deinen $GLOBALS den Wald vor lauter Bäumen nicht, was aber z. T. daran liegt, dass ich mir die Augen zuhalten muss.

Das function-Schlüsselwort wird bei der Definition einer Funktion benötigt, aber nicht bei ihrem Aufruf.

PHP-Code:
// Definition
function multiply ($x$y) {
    return 
$x $y;
}

// Aufrufe
$prod multiply(34); // prod ist jetzt 12
echo multiply($prod13); // 156 wird ausgegeben 
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #6 (permalink)  
Alt 22-06-2011, 10:45
culturo
 Registrierter Benutzer
Links : Onlinestatus : culturo ist offline
Registriert seit: Jun 2011
Ort: Asia
Beiträge: 5
culturo befindet sich auf einem aufstrebenden Ast
Standard

Hab mir das nochmal mit dem Register Golbals angesehen. Jetzt weiß ich auch nicht mehr, warum ich mir damals angewöhnt hab, die globalen Variablen als $GLOBALS auszuzeichnen.

Nun gut, so sieht der Code jetzt aus:

PHP-Code:
if ($db_obj=$db->prepare($db_sql_stm)) {
    
$db_obj->execute();
    
$db_obj->bind_result($foo$bar$baz);
    
$cou_ds=0;
    while (
$db_obj->fetch()) {
        
$pag[$cou_ds]['foo']=$foo;
        
$pag[$cou_ds]['bar']=$bar;
        
$pag[$cou_ds]['baz']=$baz;
        
$cou_ds++;
    }
    
$db_obj->close();
} else {
    
$err_db='Error '.$db->errno.' - '.$db->error;
    echo 
'<br>'.$err_db.'<br>';

So sieht übrigens $db_sql_stm beispielsweise aus.

PHP-Code:
SELECT foobarbaz FROM pag
Jetzt hab ich das mal verbaut:

PHP-Code:
function bnd_res ($db_obj$db_cm// Das natürlich vor dem Aufruf
{
    
$db_obj->bind_result($db_cm);
}
 
call_user_func_array('bnd_res'$db_cm); // Das anstatt $db_obj->bind_result($foo, $bar, $baz); 
Dann bekomme ich das:

Fatal error: Call to a member function bind_result() on a non-object in x.inc on line x

Aber das war natürlich klar. Ist es nicht so, dass wenn das funktioniert hätte, ich gar keine Funktion brauchen würde, sondern einfach das $db_obj->bind_result($db_cm); anstatt $db_obj->bind_result($foo, $bar, $baz); schreiben müsste?

Ist natürlich ne rhetorische Frage. Habs ja ausprobiert.

Was muss ich ändern, damit ich mit variabler Anzahl an Parametern arbeiten kann?

Geändert von culturo (22-06-2011 um 11:12 Uhr) Grund: Hab das Wichtigste vergessen.
Mit Zitat antworten
  #7 (permalink)  
Alt 22-06-2011, 11:18
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Warum nimmst du nicht PDO? Da kannst du mit Prepared Statements arbeiten, ohne gleichzeitig das Ergebnis zeilenweise binden zu müssen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #8 (permalink)  
Alt 25-06-2011, 11:18
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von culturo Beitrag anzeigen
Hab mir das nochmal mit dem Register Golbals angesehen. Jetzt weiß ich auch nicht mehr, warum ich mir damals angewöhnt hab, die globalen Variablen als $GLOBALS auszuzeichnen.
Du sollst gar keine globalen Variablen verwenden! Global ist böse! Kein Mensch braucht global.
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
bind_result, call_user_func_array, function, mehrere parameter, prepared statements


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
real_escape oder prepared statements lalaland SQL / Datenbanken 3 31-05-2011 14:11
Problem mit Prepared Statements Jama22 PHP Developer Forum 4 07-09-2010 01:14
mysqli: Probleme bei num_rows mit prepared statements INC. SQL / Datenbanken 8 20-05-2010 17:59
Probleme mit Funktionen im SQL Statement bei verwendung von prepared Statements typolos PHP Developer Forum 4 05-02-2009 18:41
Hilfe zu Syntax-Fehler bei PDO prepared Statements lippes SQL / Datenbanken 7 26-01-2008 19:27

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

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