php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.05.2010, 20:28  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] call_user_func_array und bind_param Problem

Hey
Ich möchte sämtliche MySQLi-Anweisungen in eine einzige Klasse packen. Das klappt soweit ganz gut, bei den Prepared-Statements allerdings stoße ich auf ein Problem. Folgende Methode soll die Anweisung bind_param() übernehmen. Dafür generiere ich ein Array mit allen übergebenen Parametern, welche ich dann an die bind_param() weiterleite, so dass man dann später bequem mit $objekt->set_parameter($bind, $value) die "Variablen" befüllen kann.
Der Code dazu sieht so aus:
PHP-Code:
function bind()
    {
        
//Minimum 2 Argumente werden benötigt
        
$arg_num func_num_args();
        if (
$arg_num 1) return false;
        
        
$datastring func_get_arg(0);
        
$i 1//0 wird übersprungen da im $datastring
        
while ($i $arg_num)
        {
            
$this->params[func_get_arg($i)] = "test"//Das Array mit den "gebindeten" Variablen
            
$i++;
        }
        
        
//$datastring an das array anfügen, zwecks funktionsaufruf
        
array_unshift($this->params, &$datastring);
        
//bind_param aufrufen und Parameter übergeben 
                
if (!call_user_func_array(array($this->prep_obj"bind_param"), &$this->params))
            
$this->exc("Parameter konnten nicht gebunden werden!");
                } 
Die Variablen werden dann so befüllt:
PHP-Code:
function set_parameter($parameter$value)
    {
        
$this->params[$parameter] = &$value;
        
    } 
Das Array wird auf diese Art richtig angepasst (das ergab ein die() ), wenn ich dann allerdings ein execute() aufrufe wird bei einem INSERT-Kommando nicht das eingetragen was ich über set_parameter() festgelegt habe, sondern das was beim initialisieren des arrays eingetragen wurde in die datenbank geschrieben (in dem fall hier also immer "test").

Beim Nachforschen bin ich auf einen Hinweis auf php.net gestoßen:
Zitat:
Hinweis: Care must be taken when using mysqli_stmt_bind_param() in conjunction with call_user_func_array(). Note that mysqli_stmt_bind_param() requires parameters to be passed by reference, whereas call_user_func_array() can accept as a parameter a list of variables that can represent references or values.
Aber das hilft mir nicht weiter, meiner Meinung nach werden alle Werte korrekt by reference übergeben?!

Danke für Hilfe
Ballamann ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 25.05.2010, 21:43  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Versteh nicht, was das für einen SInn haben soll?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 25.05.2010, 22:09  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard

Das ich alles was mit Datenbanken zu tun hat in einer Klasse habe. Fehlerüberprüfungen etc. kann ich mir damit schon vereinfachen.
Wie würdest du es denn machen?

Und selbst wenn das Unsinn sein sollte - warum funktioniert es nicht?
Ballamann ist offline  
Alt 25.05.2010, 22:16  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

mysqli ist bereits eine Klasse mit allen Funktionen in einem Objekt.

Ich verstehe schon allein Deinen Plan mit set_parameter nicht, weil da ja das Type-Binding fehlt.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 25.05.2010, 22:38  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard

Hmm es wäre vielleicht einfacher gewesen einfach von der Klasse zu erben und zu erweitern oder was meinst du?

Und zu set_parameter:
mysqli->bind_param($typ, $variable1, $variable2,...) erwartet als ersten parameter ja den typ für die variablen die ihm danach übergeben werden. Also ist mir im Moment ja nicht bekannt welcher Type erwartet wird oder?! Und das ganze muss überhaupt erst so kompliziert werden weil ich ja nicht weiß wieviele Parameter an das bind_param übergeben werden müssen, deswegen der Umweg über ein Array das alle "Variablen" enthält die an die methode übergeben werden sollen, und die Werte dieses Arrays ändert man über set_parameter().
Ballamann ist offline  
Alt 25.05.2010, 22:44  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Aus genau diesem Grund ist es zwecklos, einen Wrapper zu schreiben.
Zitat:
Also ist mir im Moment ja nicht bekannt welcher Type erwartet wird oder?!
Wem, wenn nicht Dir! Gerade die Typvorgabe ist wichtig, da ja dadurch die Sicherheit erreicht wird. Wenn Du die Parameter einzeln binden willst, kannst DU das ja machen, die Typvorgabe musst Du trotzdem angeben, sonst ist Dein gesamtes Konzept nichts wert.
Allerdings frage ich mich auch ernsthaft, welchen Wert ein Objekt mit dynamischen Parametern hat, wenn Du sowieso irgendwo die zugrundeliegende Query statisch angeben musst.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 25.05.2010, 23:17  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard

naja Ziel des Ganzen sollte es eigentlich nur sein den ganzen Datenbankteil auslagern zu können.
Für einen Profi mag das vielleicht sinnlos erscheinen, mir in ein, zwei monaten hoffentlich auch, aber im moment hab ich vorallemdingen nen relativ großen lerneffekt dadurch!

Deswegen, egal ob das sinnvoll sein sollt eoder nicht, aber ich würds schon gern zum Laufen bringen.
Ballamann ist offline  
Alt 25.05.2010, 23:19  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Dann beschreibe die Anforderung. Mir ist immer noch nicht klar, wie der Aufruf mit Deinem neuen Objekt aussehen soll.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 25.05.2010, 23:33  
Neuer Benutzer
 
Registriert seit: 21.01.2010
Beiträge: 23
PHP-Kenntnisse:
Anfänger
Ballamann befindet sich auf einem aufstrebenden Ast
Standard

PHP-Code:
$db = new db;
$db->prepare_query("INSERT INTO user (Feld1, Feld2, Feld3, Feld4) VALUES (?, ?, ?, ?)");
$db->bind("ssss""var1""var2""var3""var4");
$db->set_parameter("var1""Testnickname");
$db->set_parameter("var2""hat keins");
$db->set_parameter("var3""100");
$db->set_parameter("var4""ÄttDot");
$db->execute();
$ergebnis $db->fetch_result() 
So funktioniert der Aufruf meines neuen Objekts.
In der Funktion bind() werden alle übergebenen Variablen in ein assoziatives Array geschrieben (als Offsets) und ihnen wird probehalber der Wert "test" zugewiesen. Über set_parameter kann man dann die einzelnen Werte des Arrays ändern, man gibt den Namen und den Wert an. Das funktioniert soweit auch, wenn ich mir danach das Array ausgebe sind die vorher initialisierten Felder geändert. Wenn ich dann aber execute() aufrufe werden diese Änderungen ignoriert und nur der Wert "test" wird in die Datenbank geschrieben - also nur der Wert der bei der Initialisierung zugewiesen wurde. Da liegt mein Problem.
Ballamann ist offline  
Alt 25.05.2010, 23:37  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Ballamann Beitrag anzeigen
So funktioniert der Aufruf meines neuen Objekts.
Das Erzeugen des neuen DB-Objektes, Vorbereiten der Query, Binden der Variablen und Ausführen - all das läuft ganz genau so, wenn du wirklich das native MySQLi nimmst.

Im Grunde hast du nur die Funktionen „umbenannt“ - ausführen musst du sie nach wie vor alle (und bei deinem Code noch ein paar zusätzliche).

Gewinn, und damit Sinn des ganzen Unterfangens - absolut keiner.
Ausser du betrachtest es als Gewinn, dass dein Code nicht funktioniert. Nicht lauffähige Scripte kann man sich aber auch mit weniger Aufwand basteln.
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline  
 


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
Problem mit Ajax - Session Problem halskrause PHP Tipps 2009 10 12.01.2010 02:27
[Erledigt] Problem mit Mehrsprachigkeit Sniper_Kotaro PHP Tipps 2009 2 16.12.2009 11:47
Problem beim Download Management mistermint PHP Tipps 2009 8 24.10.2009 11:34
Umlaut Problem nokieone PHP Tipps 2009 7 16.10.2009 19:30
Problem mit Basedir in PhP cmuch05 Datenbanken 9 08.01.2009 14:17
[Erledigt] Problem: PHP Selbe Datei mehr als 1 Mal soulan PHP Tipps 2008 13 28.11.2008 22:51
Problem Upload mehrere Dateien und schreiben in DB Lapje PHP Tipps 2008 1 22.10.2008 13:12
utf8 Problem (Daten aus DB auslesen) go1denboy PHP Tipps 2008 1 23.09.2008 12:19
Problem mit swfobjects R4v3r JavaScript, Ajax und mehr 8 21.09.2008 14:17
[Erledigt] Galerie Problem... coraplanet PHP Tipps 2008 4 06.06.2008 13:42
datensätze defekt oder problem mit dem einlesen? Ministry Datenbanken 4 06.07.2006 18:42
problem!!! PHP Tipps 2006 6 08.02.2006 11:06
Smarty und PHP-Skript Problem PHP Tipps 2004-2 2 03.12.2004 22:27
Problem mit alter JavaScript-Funktion woods PHP Tipps 2004 1 13.08.2004 13:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php bind_param versteh ich nicht, bind_param array, php call_user_func_array, call_user_func_array, php bind_param, bind_param, bind_param php, call_user_func_array bind_param, php mysql bind_param call_user_func_array -pdo, mysqli bind_param array, call_user_func_array(\'mysqli_stmt_bind_param\', call_user_func_array php, http://www.php.de/php-einsteiger/68272-erledigt-call_user_func_array-und-bind_param-problem.html, bindparam viele werte, mysqli_stmt_bind_param \invalid type or no type\, call_user_func_array(array(, php my sql prepared statement bind_param call_user_func_array -pdo, bind_param bit in mysql eintragen php kommando, : mysqli_stmt_bind_param() [function.mysqli-stmt-bind-param]: invalid type or no type, call_user_func_array() mysqli_stmt_bind_param

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:02 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