php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.09.2009, 13:24  
Neuer Benutzer
 
Benutzerbild von DeLoke
 
Registriert seit: 19.11.2008
Beiträge: 15
PHP-Kenntnisse:
Fortgeschritten
DeLoke befindet sich auf einem aufstrebenden Ast
DeLoke eine Nachricht über ICQ schicken
Standard [Erledigt] MySQLi Prepared Statements | bind_result() als Array || Variablenreferenze

Hallo, Ich hätte ein kleines Problem mit den Prepared Statemends von der PHP MySQLi erweiterung, mein versuch ist es das Prepared statemends in meiner erweiterten SQL klasse die gleichen rückgabeobjekte erzeugen wie es ein normaler query tut.

Etwas weiter kam ich hier mit dem thread :
http://www.php.de/datenbanken/52493-...tatements.html (MySQLi und Prepared Statements)

Weitgehend scheint das ganz gut zu funktionieren ... doch bind_result() arbeitet anscheinend mit Referenzen auf Variablen und nicht mit den variablen selbst. d.h. wenn ich versuche die Variablen sofort auszugeben, erhalte ich die richtigen Daten, wenn ich sie jedoch in dem Array abspeichere haben danach alle zeilen die aus der datenbank zurückgegeben wurden den gleichen inhalt.

Hat da eventuell jemand ne einigermassen schöne idee wie man das lösen könnte ... ich hatte selbst mal an var_export() und eval gedacht, aber das ist eine alles andere als schöne lösung.

Achso z.t. Crossposting ... diese Frage wurde bereits in einem anderen forum gestellt, ist aber mitlerweile so weit in die ewige verdammniss gerutscht das ich eig. keine hoffnung mehr habe das das problem dort gelöst wird, deshalb möchte ich auch hier versuchen diese Frage nochmal zu stellen.
Prepared Statements Result Objekt erstellen. - Forum: phpforum.de

Nochwas es sind noch teile Debugcode enthalten und noch nicht alles aussenrum so aufgebaut wie es sein soll wenn i-wo Seltsamer code drinne ist, wenn euch aber sonst was störendes auffällt ich bin immer dankbar für infos.

Die Problemmethode ist die letzte die in dem eingefügten Quellcode enthalten ist. "getInArray()" der rest ist mehr zur veranschaulichung ... so der sinn dahinter.

PHP-Code:
<?php
namespace denostylelibrarycommanddatabase
;

class 
mysqlDB extends mysqli
{
    protected 
$lastresult;
    protected 
$preparedObject;
    protected 
$lastPreparedStatement;

    public function 
preparedQuery($query)
    {
        
$prepare =  $this->prepare($query);
        
$numArgs func_num_args()-1;
        
$paramType '\'';
        
$eval Null;
        if(
$numArgs != 0) {
            for(
$i 1$i <= $numArgs$i++)
            {
                
$x $i-1;
                if( 
is_stringfunc_get_arg$i ) ) )       $paramType .= 's';
                elseif( 
is_integerfunc_get_arg$i ) ) )  $paramType .= 'i';
                elseif( 
is_floatfunc_get_arg$i ) ) )    $paramType .= 'd';

                
$werte[$x] = func_get_arg$x );
                
$eval[] = '$werte[' $x .']';
            }
            
$paramType .= '\'';
            
$eval implode(', '$eval);

            eval( 
'$prepare->bind_param( ' $paramType ', ' $eval ' );' );
        }
        
$prepare->execute();
    
        
$this->lastresult = new resultobject(&$prepare);
        
        return 
$this->lastresult;
    }

    public function 
lastResultArray()
    {
        while(
$array[] = $this->lastresult->fetch_array());
        return 
$array;
    }

    public function 
freeLastResult()
    {
        
$this->lastresult->free_result();
    }
    
    public function 
lastResultRows()
    {
        return 
$this->lastresult->num_rows;
    }

    public function 
lastResultFields()
    {
        return 
$this->lastresult->field_count;
    }

    public function 
query($query)
    {
        
        
$this->lastresult parent::query($query);
        return 
$this->lastresult;
    }
}

class 
resultobject
{
    protected 
$mysqli_stmt$row;

    public function 
__construct($object)
    {
        
$this->mysqli_stmt = &$object;
    }

    public function 
getInArray($resultmode 'assoc')
    {
        
$object $this->mysqli_stmt;
        
$result $row $this->row $result_both = array();
        
$meta $object->result_metadata();

        while(
$field $meta->fetch_field())
        {
            switch(
$resultmode) {
                case 
'array':
                    
$result[$field->name] =  &$this->row[$field->name];
                    
$result[] = &$this->row[$field->name];
                break;

                case 
'assoc':
                    
$result[$field->name] =  &$this->row[$field->name];
                break;

                case 
'num':
                    
$result[] = &$this->row[$field->name];
                break;
            }
        }
        
        
call_user_func_array(array(&$object'bind_result'), $this->row);
        
$i 0;
        while(
$object->fetch()){
            
$row2[$i] = $this->row;
            
var_dump($this->row);
            
$i++;
        }

        return 
$row2;
    }
}

Geändert von DeLoke (09.09.2009 um 13:38 Uhr).
DeLoke ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 09.09.2009, 13:36  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich habe gestern schon überlegt, ob ich dir "drüben" schreibe, dass du eventuell die Objekte clonen könntest, aber weiß nicht, wie passend diese Antwort ist. For what it's worth. Kann kompletter Quark sein.
mermshaus ist offline   Mit Zitat antworten
Alt 09.09.2009, 13:45  
Neuer Benutzer
 
Benutzerbild von DeLoke
 
Registriert seit: 19.11.2008
Beiträge: 15
PHP-Kenntnisse:
Fortgeschritten
DeLoke befindet sich auf einem aufstrebenden Ast
DeLoke eine Nachricht über ICQ schicken
Standard

Hmm Objekte Clonen, ansich klingts sinnvoll .... aber wenn ich z.b. 200 einträge aus der datenbank zurückbekomme und das objekt dann 199 mal geklont werden muss benötige ich warsch. auch keine prepared statements mehr von dem was das an performace fressen würde ...

Aber gut ich bin mir auch nicht sicher ob das so richtig ist wie ich es gerade geschrieben habe ... klingt aber nach utopichem speicherverbrauch.
Sonst würde es warsch. funktionieren.

Aber danke dir schonmal für deine Antwort

Geändert von DeLoke (09.09.2009 um 14:38 Uhr).
DeLoke ist offline   Mit Zitat antworten
Alt 09.09.2009, 15:07  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Wozu eigentlich in while($field = $meta->fetch_field()) { ... } die Referenz-Zuweisungen (&$this->...)? Vielleicht hakt es dort. Was ist das für ein Datentyp, den $this->row[$field->name] zurückgibt?

Und sowas $this->lastresult = new resultobject(&$prepare); ist PHP4-Stil. Die &-Operatoren sind bei Objekt-Parametern insgesamt unnötig.
mermshaus ist offline   Mit Zitat antworten
Alt 09.09.2009, 16:03  
Neuer Benutzer
 
Benutzerbild von DeLoke
 
Registriert seit: 19.11.2008
Beiträge: 15
PHP-Kenntnisse:
Fortgeschritten
DeLoke befindet sich auf einem aufstrebenden Ast
DeLoke eine Nachricht über ICQ schicken
Standard

Hmm ok, stimmt eig. Objekte sind werden ja eig. ohnehin als art referenzen angesteuert, ist ja nur die Objektid die Kopiert wird ... Danke

Die Referenzzuweisungen hmm die idee da ist wohl das ich es als numeriches Array bekommen kann oder als Assozitives wie auch gemischt.

Ich hab auch schon rumprobiert das wegzulassen aber da scheint das problem nicht zu existieren

while( $meta->fetch_field() ) zählt die vorhandenen felder in der abfrage auf um die namen der felder zu bekommen ... eig. sollte später die $result variable zurückgegeben werden die als referenz aus die $row variable fungiert damit die Variablen nicht doppelt belegt werden und um damit den Speicher zu schonen.
Wenn der fehler darin liegen würde müsste ja die $result varible den fehler enthalten und nicht die row variable.
Wenn ich die Row variable sofort ausgebe funktioniert es ja auch, das problem liegt da sobald die methode $object->fetch() aufgerufen wird werden alle vorherigen Arrayzeilen mit dem neuen wert überschrieben.

PHP-Code:
 while($object->fetch()){
            
$row2[$i] = $this->row;   // $row2[0] hat das gleiche ergebniss wie $row2[325] usw. das ergebniss aller zeilen ist das was zuletzt ausgegeben wurde.
            
var_dump($this->row); // gibt alle zeilen Korrekt aus.
            
$i++;
        } 
Achso $this->row[$field->name] ist vom typ null solange bis bind_result() aufgerufen wird. dann soll es erst mit einer variablen belegt werden.

Geändert von DeLoke (09.09.2009 um 16:48 Uhr).
DeLoke ist offline   Mit Zitat antworten
Alt 09.09.2009, 17:01  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Zitat:
Zitat von DeLoke Beitrag anzeigen
sollte später die $result variable zurückgegeben werden die als referenz aus die $row variable fungiert damit die Variablen nicht doppelt belegt werden und um damit den Speicher zu schonen.
Ich habe noch nicht versucht, mich wirklich in deinen Code reinzudenken, aber such mal nach php "copy on write". Ich glaube, was du hier beschreibst, optimiert PHP bereits intern.
mermshaus ist offline   Mit Zitat antworten
Alt 09.09.2009, 22:47  
Erfahrener Benutzer
 
Benutzerbild von Phoscur
 
Registriert seit: 01.12.2008
Beiträge: 450
PHP-Kenntnisse:
Fortgeschritten
Phoscur wird schon bald berühmt werdenPhoscur wird schon bald berühmt werden
Standard

Hab ein wenig rumprobiert, und letztlich meinen mysqli-Kram verworfen. Ich steige auf PDO um, irgendwie einfacher als sich rumzuärgern...

Die Lösung ist eigentlich recht einfach, du musst die Werte aus der Referenz herausbekommen. Das ginge zB durch einen Typecast, oder einfach einen Funktionsaufruf. Hier auch eine Beschreibung:
PHP: mysqli_stmt::bind_result - Manual
In den Kommentaren wird man öfters fündig...
__________________
Phoscur ist offline   Mit Zitat antworten
Alt 10.09.2009, 03:49  
Neuer Benutzer
 
Benutzerbild von DeLoke
 
Registriert seit: 19.11.2008
Beiträge: 15
PHP-Kenntnisse:
Fortgeschritten
DeLoke befindet sich auf einem aufstrebenden Ast
DeLoke eine Nachricht über ICQ schicken
Standard

Hmm eig. ne einfache logische lösung ja ... aber ich währe trozdem nicht darauf gekommen.

Dankesehr.

zu PDO ... naja mit der MySQLi ist nur der anfang zum testen PDO kommt als nächstes, erst wird die eine klasse aber jetzt fertig gemacht.

Und ja, wer lesen kann ist klar im Vorteil
DeLoke ist offline   Mit Zitat antworten
Alt 10.09.2009, 13:46  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

mhh hatte das mal irgendwo rumliegen bin aber inzwischen auf PDO, da das wesentlich sinnvoller ist als MySQLi. Prepared Statements ohne benannte Parameter sind sowieso ziemlich anstrengend.

Viel Spaß bei deinem Vorhaben, ich an deiner Stelle würde direkt auf PDO gehen.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 10.09.2009, 14:04  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Semi-Offtopic:

Hier noch ein wenig was zu copy on write, auch wenn es vielleicht zu den Grundlagen zählt (für mich war es bis vor kurzem keine) und etwas am Thread vorbeigeht.

Faustregel: Don't try to be clever with references.

http://derickrethans.nl/files/phparc...es-article.pdf

Kleines Beispiel:

PHP-Code:
<?php

header
('Content-Type: text/plain');

if (!isset(
$_GET['t'])) {
    
$file 'http://' $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];

    echo 
file_get_contents($file '?t=1');
    echo 
file_get_contents($file '?t=2');
    echo 
file_get_contents($file '?t=3');
    echo 
file_get_contents($file '?t=4');
    echo 
file_get_contents($file '?t=5');
    echo 
file_get_contents($file '?t=6');
} else {
    
$a str_repeat('x'100000);

    echo 
$_GET['t'] . ')' "\n";

    switch (
$_GET['t']) {
        case 
1:
            echo 
"\t" '$b = &$a     ';
            
$b = &$a;
            break;
        case 
2:
            echo 
"\t" '$b = $a      ';
            
$b $a;
            break;
        case 
3:
            echo 
"\t" '$b = $a' "\n"
                 
"\t" '$b[0] = \'y\'  ';
            
$b    $a;
            
$b[0] = 'y';
            break;
        case 
4:
            echo 
"\t" '$b = &$a' "\n"
                 
"\t" '$c = $a      ';
            
$b = &$a;
            
$c $a;
            break;
        case 
5:
            echo 
"\t" '$b = &$a' "\n"
                 
"\t" '$c = $a' "\n"
                 
"\t" '$d = $a      ';
            
$b = &$a;
            
$c $a;
            
$d $a;
            break;
        case 
6:
            echo 
"\t" '$b = &$a' "\n"
                 
"\t" '$c = $a' "\n"
                 
"\t" '$d = $c      ';
            
$b = &$a;
            
$c $a;
            
$d $c;
            break;
    }

    echo 
'=> ' memory_get_peak_usage() . "\n\n";
}
Ausgabe bei mir:

Code:
1)
	$b = &$a     => 161356

2)
	$b = $a      => 161356

3)
	$b = $a
	$b[0] = 'y'  => 261468

4)
	$b = &$a
	$c = $a      => 261484

5)
	$b = &$a
	$c = $a
	$d = $a      => 361664

6)
	$b = &$a
	$c = $a
	$d = $c      => 261596

Geändert von mermshaus (10.09.2009 um 14:08 Uhr).
mermshaus 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
MySQLi und Prepared Statements #Avedo Datenbanken 5 24.03.2010 17:39
Prepared Statements immer einsetzen? Sangreal PHP-Fortgeschrittene 10 19.10.2009 09:28
merge Array? tommy_725 PHP Tipps 2009 3 07.08.2009 18:30
[Erledigt] Tabellen die sich selbst referenzieren Squall PHP Tipps 2009 19 04.08.2009 21:33
[Erledigt] array sortieren PHP Tipps 2004 17 13.05.2009 10:44
Array umwandeln von zwei zu mehrdimensional erselbst PHP Tipps 2009 6 02.04.2009 23:30
Turnierbaum aus array erstellen kingflo PHP-Fortgeschrittene 11 30.07.2008 11:32
Array auslesen andrew22 PHP Tipps 2006 3 21.01.2006 23:06
Array Formatierung PHP Tipps 2006 3 17.01.2006 19:12
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
Sortieren von Arrays mit mehr als 2 Dimensionen (Teil 2) Buhmann PHP-Fortgeschrittene 4 12.07.2005 14:03
[Erledigt] Mehrdimensionales Array in eindimensionales Array umwandeln PHP-Fortgeschrittene 3 03.01.2005 22:31
Abfrage mit id aus anderer Tabelle suter PHP Tipps 2004-2 15 16.12.2004 14:25

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
bind_result, mysqli bind_result array, php bind_result, bind_result array, mysqli bind_result, php bind_result array, bind_result to array, php mysqli bind_result array, mysqli prepare array, php mysqli bind_result, mysqli prepared statements array, prepared statements array, bind_result php deutsch, bind_result php, mysqli prepared statement array, mysql prepared statements fetch array, php prepared statements array, php mysqli prepared statements, mysqli prepare, bind_result problem

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