TP Underground Lounge 07/08
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 29.08.2007, 19:30   #1
TP-Junior
 
Registriert seit: May 2007
Ort: Harburg
bluefanu macht alles soweit korrekt

mysql_query Varianten


Hallo

Mich plagt mal eine Frage die ich mir selber nicht beantworten kann.
Es geht darum, Daten aus der Datenbank zu lesen und darzustellen.

Drei Möglichkeiten die ich gefunden habe:
PHP-Code:
// Variante 1.
$abfrage "SELECT `id`, `titel`, `text` FROM tabelle";
$ergebnis mysql_query($abfrage);
while(
$row mysql_fetch_object($ergebnis)){
echo 
"<p>".$row->titel." - ".$row->text."</p>";
}

// Variante 2,
$abfrage mysql_query("SELECT `id`, `titel`, `text` FROM tabelle";
while(
$row mysql_fetch_row($abfrage)){
echo 
"<p>".$row['titel']." - ".$row['text']."</p>";
}

// Variante 3.
$abfrage mysql_query("SELECT `id`, `titel`, `text` FROM tabelle";
while(list(
$id$titel$text) = mysql_fetch_row($abfrage)){
echo 
"<p>".$titel." - ".$text."</p>";

Alle drei machen das gleiche, kennt noch jemand eine weitere ?
Welche würdet ihr "warum" verwenden und welche "warum" auf keinem fall ?

lg bluefanu
bluefanu ist offline   Mit Zitat antworten


Alt 30.08.2007, 01:30   #2
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
Hallo bluefanu,

es gibt, um mal die wichtigsten zu nennen: mysql_fetch_assoc, mysql_fetch_row, mysql_fetch_object. Es gibt noch mysql_fetch_array das _assoc und _row in sich vereint, sofern im Zusatzparameter nicht angegeben wird das man nur z.B. ASSOC geliefert haben möchte.

mysql_fetch_assoc()
Daten in einem Datensatz sind über ein assoziatives Array ansprechbar. Hat man ein als 1. Feld ein "id" in der DB, dann kann man mit z.B. $datensatz['id'] darauf zugreifen.

mysql_fetch_row()
Daten eines Datensatzes werden über den numerischen Index angesprochen. Hat man ein als 1. Feld ein "id" in der DB, dann kann man mit z.B. $datensatz[0] darauf zugreifen.

mysql_fetch_object()
Behandelt einen kompletten Datensatz als Objekt. Feldnamen werden zu Eigenschaften des Objekt auf die man mit dem Pfeil zugreifen kann, z.B. $datensatz->id

Kennt man die Struktur der Datenbank genau, sollte man mit der _row Variante arbeiten. Die ist am schnellsten und belegt am wenigsten Resourcen, ist aber am unübersichtlichsten und andere (aber Du selbst auch, nach einer längeren Zeit) werden sich nur schwer wieder zurechtfinden.
Ich persönlich benutze fast ausschließlich mysql_fetch_object(), weil ich die DB Kommunikation eh objektorientiert über Klassen mache.

Ansonsten ist das mehr oder weniger Geschmackssache welche Variante Du benutzt.
Rizzo ist offline   Mit Zitat antworten
Alt 30.08.2007, 09:40   #3
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Hallo Rizzo,

ich bestätige alles, was Du geschrieben hast.

Aber woran machst Du das hier fest?

Zitat:
Zitat von Rizzo Beitrag anzeigen
Kennt man die Struktur der Datenbank genau, sollte man mit der _row Variante arbeiten. Die ist am schnellsten und belegt am wenigsten Resourcen
Nach meinem Verständnis ist gegenüber der mysql_fetch_object-Variante lediglich der Typ der zurückgegebenen Variable anders, sollte sich aber performancetechnisch nicht auswirken. Hast Du da eine Quelle zum Nachlesen?
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 30.08.2007, 09:55   #4
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
Zitat:
Zitat von DSB Beitrag anzeigen
Aber woran machst Du das hier fest?
Hallo DSB,

das habe ich, wenn ich mich recht erinnere, in den Büchern von Jörg Krause (PHP 5 Grundlagen und Profiwissen), sowie irgendwo in der Online Doku gelesen. Dort wird auch erwähnt das mysql_fetch_object zu den langsameren der fetch Methoden zählt. (Zu der Funktion gibt es auch eine kurze Anmerkung im Manual, wo es heisst "Unter Berücksichtigung der Ausführungsgeschwindigkeit ist diese Funktion identisch zu mysql_fetch_array() und fast so schnell wie mysql_fetch_row() (der Unterschied ist unwesentlich).")
Langsam ist aber ein sehr dehnbarer Begriff, weil der Unterschied wohl meßbar, nicht aber wirklich spürbar ist - ähnlich wie bei Strings mit ' und "

Auch bei mysql_fetch_array() findet sich im Manual ein Hinweis, daß diese Funktion "nicht signifikant" langsamer ist als mysql_fetch_row() - aber langsamer bleibt langsamer, auch wenn es nur ein bisschen ist
Rizzo ist offline   Mit Zitat antworten
Alt 30.08.2007, 12:09   #5
TP-Junior
 
Registriert seit: May 2007
Ort: Harburg
bluefanu macht alles soweit korrekt
Question

Mahlzeit
Zitat:
Zitat von Rizzo
mysql_fetch_row()
Daten eines Datensatzes werden über den numerischen Index angesprochen. Hat man ein als 1. Feld ein "id" in der DB, dann kann man mit z.B. $datensatz[0] darauf zugreifen.

...

Kennt man die Struktur der Datenbank genau, sollte man mit der _row Variante arbeiten.
hmmm... in meinem Beispiel (Variante 3.) muss ich doch nur die Feldnamen kennen und kann die dann direkt via $datensatz ansprechen.
Liegt das an (list($datensatz, ...) ?

lg bluefanu
bluefanu ist offline   Mit Zitat antworten
Alt 30.08.2007, 15:04   #6
TP-Urgestein
 
Benutzerbild von webcreate
 
Registriert seit: Nov 2003
Ort: NRW
webcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichtswebcreate ist einer der Eckpfeiler des TP - ohne ihn geht nichts
Richtig, dazu sollte man sich list() mal anschauen, dann sollte auch klar sein, wie es arbeitet.
__________________
Gruß Mark
Mein Blog zum TP || XING Profil || grafiker.de Profil || How to use GOOGLE
emCalculator 1.0

webcreate IT SOLUTIONS
www.webcreate-nrw.de
webcreate ist offline   Mit Zitat antworten
Alt 01.09.2007, 14:59   #7
TP-Junior
 
Registriert seit: Mar 2007
Ort: Berlin
ronsn macht alles soweit korrekt
Hallo. Ich hab dazu auch ne Frage. Ich hab in meinen Büchern gelernt, dass SQL-Quries in etwa so aussehen:
Code:
"SELECT text FROM tabelle WHERE id = 1 "
Aber das funktioniert bei mir nicht.
Wenn ich eine solche Abfrage in PHPMyAdmin manuell ausführe, kommt als SQL-Statement folgendes:
Code:
"SELECT `text` FROM `tabelle` LIMIT 0 , 30"
Noch ein Beispiel:
Laut Buch und Online-Dokumentationen wurde mir das so beigebracht.
Code:
"UPDATE tabelle SET text = 'Neuer Text' WHERE id =1"
Aber in PHPMyAdmin nach manuellem Ändern:
Code:
"UPDATE `tabelle` SET `text` = 'Neuer Text' WHERE `text`.`id` =1 LIMIT 1 ;"
Alle Queries, funktionieren bei meinem XAMPP nur, wenn ich die SQL-Anweisungen aus PHPMyAdmin kopiere und in meinem PHP-Code einfüge. Meine eigenen jedoch nicht (manchmal hatten einige aber doch funktioniert).
Aber warum ist das so unterschiedlich. Ich sehe auch hier in den Workshops diese Queries, so wie ich es gelernt habe. Hat sich da was verändert oder liegt das Problem nur an meinem XAMPP?
ronsn ist offline   Mit Zitat antworten
Alt 01.09.2007, 17:20   #8
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Zitat:
Zitat von ronsn Beitrag anzeigen
Hallo. Ich hab dazu auch ne Frage. Ich hab in meinen Büchern gelernt, dass SQL-Quries in etwa so aussehen:
Code:
"SELECT text FROM tabelle WHERE id = 1 "
Aber das funktioniert bei mir nicht.
Kein Wunder. "text" ist auch in den neueren MySQL-Versionen ein reserviertes Befehlswort. Deshalb muss es in Backticks gesetzt werden.
machs mal so:
Code:
"SELECT `text` FROM `tabelle` WHERE id = 1 "
Dann sollte es auch mit Deinen Queries klappen.
Wie alt ist das Buch denn? Eigentlich sollte der Autor das wissen. *g*
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 02.09.2007, 01:33   #9
TP-Junior
 
Registriert seit: Mar 2007
Ort: Berlin
ronsn macht alles soweit korrekt
Ok das waren von mir nur Beispiele mit dem "text". Ich fragte mich nur prinzipiell, ob das, was ich gelernt habe, schon veraltet ist und ob es Erneuerungen gibt. Ein großes Dankeschön spreche ich dir aber aus, weil du mir die Information gabst, dass "text" ein reserviertes Wort bei SQL (?) ist.
Was ist aber der Unterschied zwischen den "gelernten" Queries, und den von phpMyAdmin ausgegebenen Queries (,wenn man es manuell macht)? Wieso unterscheidet sich das so, und wieso hat das solch große Auswirkung?
ronsn ist offline   Mit Zitat antworten
Alt 02.09.2007, 01:44   #10
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
Zitat:
Zitat von ronsn Beitrag anzeigen
Ok das waren von mir nur Beispiele mit dem "text". Ich fragte mich nur prinzipiell, ob das, was ich gelernt habe, schon veraltet ist und ob es Erneuerungen gibt. Ein großes Dankeschön spreche ich dir aber aus, weil du mir die Information gabst, dass "text" ein reserviertes Wort bei SQL (?) ist.
Was ist aber der Unterschied zwischen den "gelernten" Queries, und den von phpMyAdmin ausgegebenen Queries (,wenn man es manuell macht)? Wieso unterscheidet sich das so, und wieso hat das solch große Auswirkung?
Naja, wer weiß was Du gelernst hast?! phpMyAdmin spuckt die Queries eben präziser aus, also artig mit LIMIT hinten dran, angabe von Tabellenname/Datenbankname vor Felder und so weiter, weil das eben so sein sollte um Fehler zu vermeiden. Oftmals braucht man das aber nicht. Was man aber immer machen sollte ist Tabellennamen, Feldnamen in Backticks setzen um nicht unwissentlich ungültige Queries zu bauen.
Rizzo ist offline   Mit Zitat antworten
Alt 02.09.2007, 12:26   #11
DSB
TP-Veteran
 
Benutzerbild von DSB
 
Registriert seit: Mar 2005
Ort: Oyten
DSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKEDSB ist ein richtiges Arbeitstier - DANKE
Zitat:
Zitat von ronsn Beitrag anzeigen
Ok das waren von mir nur Beispiele mit dem "text".
Du musst uns schon ein konkretes Beispiel zur Beurteilung geben, damit wir eine konkrete Aussage treffen können. Die Glaskugeln aller TP'ler sind gerade kollektiv zur Gemeinschaftsreinigung abgegeben worden.
__________________
Gruß, DSB
Einfaches Backup/ Restore Deiner MySQl-Datenbank
DSB ist offline   Mit Zitat antworten
Alt 02.09.2007, 14:43   #12
TP-Junior
 
Registriert seit: Mar 2007
Ort: Berlin
ronsn macht alles soweit korrekt
*G* Ja. also ein konkretes Beispiel hatte ich leider nicht mehr, da ich alle Queries aus phpMyAdmin kopiert habe und dann in meinem Quellcode eingefügt habe ohne das alte zu behalten. Ich habe mich erst gewundert, als das das dritte mal nicht lief. Gelernt habe ich das ohne ` , so wie auch hier http://www.traum-projekt.com/forum/7...er-update.html . Ich wusste jedoch nicht, dass das der(/ein) Grund ist, warum es nicht funktioniert. Die Beispiele die ich genannt habe, waren insoweit korrekt. Ich habe aber hier als Beispiel anstatt "c_blog_ent" "text" und anstatt "c_ent" "tabelle" geschrieben. Der Rest ist gleich geblieben.
Ich wollte euch nicht verwirren und nen Hocus Pocus wollte ich auch nicht erzeugen. :-)
Ok, ich hab jetzt mal alle Daten so zusammengesucht, wie es anfing. In meinem Buch (Magnum: "PHP5 & MySQL 4.1" von Markt+Technik") steht ein Query so:
Code:
CREATE TABLE user (
ID INT UNSIGNED NOT NULL AUTO_INCREMENT ,
username CHAR(50) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT
'neueruser',
kwort BINARY( 50 ) DEFAULT 'kennwort',
admin TINYINT( 2 ) DEFAULT '-1' NOT NULL ,
beschreibung CHAR( 255 ) ,
kennung CHAR( 50 ) ,
zeit DATETIME,
PRIMARY KEY ( `ID` ) ,
UNIQUE ( username )
);
Das Teil funktioniert aber nicht. Ich war schon auf der Seite brain-and-trust.de und lud mir die Orginaldateien runter, um Fehler zu vermeiden. Aber das Ergebnis war das gleiche. Nichts passierte.

Also machte ich mich dran und erstellte die Tabelle per Hand in phpMyAdmin.
Der lieferte mir einen ganz anderen Query:
Code:
CREATE TABLE `user` (
`ID` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` CHAR( 50 ) CHARACTER SET latin1 COLLATE latin1_bin NULL DEFAULT 'neueruser',
`kwort` BINARY( 50 ) NULL DEFAULT 'kennwort',
`admin` TINYINT( 2 ) NOT NULL DEFAULT '-1',
`beschreibung` CHAR( 255 ) NULL ,
`kennung` CHAR( 50 ) NULL ,
`zeit` DATETIME NULL ,
UNIQUE (
`username`
)
) ENGINE = MYISAM ;
Das ist eigentlich das Problem, was ich habe. Ich verstehe nicht warum das eine nicht geht, das andere aber doch. Kann das an irgendeiner Einstellung in meinem XAMPP liegen oder ist das jetzt neu, dass man das so schreiben muss? Bei PHP.net ist das auch immer ohne ` ...
Sorry, wenn ich mich vorher etwas missverständlich ausgedrückt habe.

Geändert von ronsn (02.09.2007 um 14:48 Uhr).
ronsn ist offline   Mit Zitat antworten
Alt 02.09.2007, 15:09   #13
TP-Moderator
 
Benutzerbild von Rizzo
 
Registriert seit: Aug 2004
Ort: Kaiserslautern
Rizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine UserRizzo lebt für das TP und seine User
Zitat:
Zitat von ronsn Beitrag anzeigen
Kann das an irgendeiner Einstellung in meinem XAMPP liegen oder ist das jetzt neu, dass man das so schreiben muss?
Neu ist das ganz sicher nicht, denn wie Du hier schon in der seit einiger Zeit veralteten MySQL 3/4 Dokumentation (v4 ist noch verbreitet, hier geht es eher um die v3) siehst, wird das schon so gemacht und da wird auch erklärt welche Wörter reserviert sind.

Es bringt auch nichts wenn Du andere Quellen anführst mit dem Argument "Ja aber die machen das auch...". Streng betrachtet ist es einfach Schlamperei es ohne Backticks zu machen. Ich, genau wie die meisten anderen hier auch, schlampen da gelegentlich schon mal aus Faulheit - richtig ist es, war es und wird es wohl immer sein, mit Backticks. Es vermeidet einfach dumme unerklärbare Fehler, schon allein aus dem Grund sollte man es benutzen.

Früher hab ich auch nie Backticks benutzt, eben weil ich es auch immer und überall ohne gesehen habe. Dann hatte ich aber irgendwann auch mal so Probleme wie Du und sass wie ein Depp vor dem Screen und mir wollte nicht einleuchten wieso es nicht geht. Das hat mich kuriert und seit dem versuche ich konsequent immer Backticks zu benutzen, auch wenn es nur für ein einziges Feld in einem Select ist, das garantiert kein reserviertes Wort ist.
Rizzo ist offline   Mit Zitat antworten
Alt 02.09.2007, 15:24   #14
TP-Junior
 
Registriert seit: Mar 2007
Ort: Berlin
ronsn macht alles soweit korrekt
Ok. Ich habs eben so gelernt, und bin traurig über diese Schlamperei.
Also fasse ich für mich nochmal zusammen, dass ALLE Datenbanknamen, Tabellennamen und Tabellenfelder mit diesem Backtick versehen werden müssen.
Aber den Satz habe ich nicht richtig verstanden.
Zitat:
Zitat von Rizzo Beitrag anzeigen
[...]also artig mit LIMIT hinten dran, angabe von Tabellenname/Datenbankname vor Felder und so weiter[...]
Angabe von was? Von LIMIT ? Oder soll in einem Query der Tabellenname bzw. Datenbankname genannt werden, bevor ich ein Feldname nenne?
Wie sähe das denn in diesem Query aus?
Code:
"SELECT `text` FROM `tabelle` LIMIT 0 , 30"
Da kann ich doch gar nicht den Tabellennamen "tabelle" voher schreiben. Oder stell ich mich grad zu blöd an?
ronsn ist offline   Mit Zitat antworten
Alt 02.09.2007, 17:12   #15
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
also nochmal zum Mitschreiben

Backticks (`) dienen dazu, Namen zu "quoten" damit es nicht zur Kollision mit Schlüsselwörten kommt. Natürlich ist das manchmal lästig, aber es hilft, um Fehler zu vermeiden.
SELECT `text` FROM `tabelle`
Arbeitet man mit mehreren Tabellen, so bietet sich der Einsatz von aliases an
SELECT g.`text`, i.`id` FROM `tabelle1` g, `tabelle2` i


In diesen Beispielen müsste man nur text quoten, da das ein Schlüsselwort ist. Möchte man auf Backticks verzichten, sollte man sorgfältig bei der Namensgebung sein
SELECT inhaltstext FROM news
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Antwort

  Aktuelles Thema
  TP Hilfe Forum > Web-Editoren & Coding > Traum-Dynamik
mysql_query Varianten mysql_query Varianten
« Seite inkludieren - Inhaltwechsel bei Linkklick | Rewrite ohne mod_rewrite? »

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Thema bewerten
Thema bewerten: