MySQL: Zählen der Einträge klappt einfach nicht
Philipp
- php
Ich hab jetzt im I-Net so alles abgegrast, was nur abzugrasen geht. Es klappt einfach nicht. Ich bekomme immer eine Supplied Argument Warning. Ich will einfach bloß die Einträge in meiner DB zählen:
<?php
include("config.php");
$db_connect = mysql_pconnect($db_host, $db_user, $db_password) or die ("Error: Connection impossible!");
mysql_select_db($db_name, $db_connect) or die ("Error: Database doesn't exist!");
$query = "SELECT COUNT(*) FROM db_table";
$result = @mysql_query($query);
echo mysql_num_rows($result);
mysql_close($db_connect);
?>
Danke im Voraus!
MfG
Hallo Philipp,
$result = @mysql_query($query);
Wieso lässt du dir wertvolle Fehlerinformationen nicht ausgeben?
Und auch immer wieder interessant und hilfreich sind die FAQ:
28.4. Supplied argument is not a valid MySQL result...
http://www.dclp-faq.de/q/q-fehler-mysql-result.html
Grüße
David
Wieso lässt du dir wertvolle Fehlerinformationen nicht ausgeben?
Darauf soll mal einer kommen! Das ist aber praktisch!
Hab den Fehler gefunden und es FUNKTIONIERT! *freu*
Nunja, mysql_error ist jetzt wohl ein neuer Freund geworden...
Servus,
die Fehlerinformation ist natürlich eine gute Geschichte.
Ich weiss jetzt nicht ob Dein neuer Thread als Soppelposting zählt Du solltest jedoch möglichst wenn es um das gleich Thema geht im alten Thread bleiben.
Das Problem an Deiner ausführung ist, dass du jedes mal eine 1 bekommst richtig?
Select count(*) liefert immer nur exakt ein Ergebniss dieses liefert es jedoch immer und das ist dei anzahl der Treffer.
Also Werte Nur das Ergebniss der abfrag aus und verwende an der Stelle nicht die Funktion von PHP.
Gruss Matze
Das Problem an Deiner ausführung ist, dass du jedes mal eine 1 bekommst richtig?
Select count(*) liefert immer nur exakt ein Ergebniss dieses liefert es jedoch immer und das ist dei anzahl der Treffer.
Also Werte Nur das Ergebniss der abfrag aus und verwende an der Stelle nicht die Funktion von PHP.
Nicht ganz, ich bekomme eine 10, obwohl 12 Einträge in der Datenbank sind. Hab jetzt folgenden Code:
$counter = mysql_query("SELECT COUNT(*) FROM $db_table");
$num_id = mysql_num_rows($counter);
echo "$num_id";
Es klappt also immer noch nicht...:(
Btw: Das mit dem Cross-Posting behalte ich im Hinterkopf, sry.
Servus,
mach mal das count incl () weg sprich select * from.
Und schau mal was er dann liefert.
PHP ist nun nicht gerade meine Stärke was macht die Funktion
mysql_num_rows($counter); Zählt diese die Zeilen einer Abnfrage?
Wenn ja ist das der falsche Weg.
Du musst das Ergebnis aus der Abfrage nehmen.
Ausserdem musst Du bei einem insert eine commit machen wie z.B.bei einer Oracle Datenbank?
Gruss Matze
mach mal das count incl () weg sprich select * from.
Und schau mal was er dann liefert.
Da kommt 130, obwohl es 13 Einträge sind. Ich kann ja einfach 100 abziehen, NBD, aber es geht ja ums Prinzip - und ums Verständnis!
PHP ist nun nicht gerade meine Stärke was macht die Funktion
mysql_num_rows($counter); Zählt diese die Zeilen einer Abnfrage?
Wenn ja ist das der falsche Weg.
Die zählt die verarbeiteten Zeilen.
Du musst das Ergebnis aus der Abfrage nehmen.
!?
Ausserdem musst Du bei einem insert eine commit machen wie z.B.bei einer Oracle Datenbank?
!?
Sry, aber ich verstehe nicht die Bohne...*lol* ^^
Danke dir aber erstmal, immerhin funktioniert es ja so halb...;)
Servus schau mal in mein Posting auf gleicher höhe wie Deines dort ist beschrieben was Du zu tun hast.
Gruss Matze
Meinst du mit "Du musst das Ergebnis aus der Abfrage nehmen." das ich den Wert uweisen soll?
Ich habs mit:
$counter = mysql_query("SELECT COUNT(*) AS num_id FROM $db_table");
#$num_id = mysql_num_rows($counter);
echo "$num_id";
probiert.
Er zeigt mir dann aber 0 (Null) an.
WTF?
Servus,
lies mal folgenden Text.
Mit mysql_num_rows() kann man sich anhand einer Ergebnis-Kennung
(Ergebnis-Kennung) die Anzahl der Datensätze eines Ergebnisses zurückgeben
lassen.
Beachten Sie bitte, dass diese Funktion nur die SELECT-Anweisung berücksichtigt.
Damit sollte bei Deiner Anwendung der Funktion eine 1 dabei raus kommen für einen Datensatz.
Wenn die abfrage jedoch keinen Datensatz liefert ist am SQL ein Fehler drin.
So und diese Funktion müsstest du verenden:
Mit mysql_result() kann man sich anhand einer Ergebnis-Kennung (Ergebnis-
Kennung) und der Angabe des Datensatz-Index (Datensatz-Index) den Inhalt
eines Feldes zurückgeben lassen. Mit dem optionalen Paremeter Feld kann man
einen Feldnamen in der Form "tablename.feldname" (siehe Beispiel) angeben.
Sollte das Feld ein Alias besitzen (select gruppe as group), so ist dieser Alias als
Feldname zu nutzen.
Falls die MySQL-Anfrage sehr viele Datensätze enthält, sollten Sie aus
Das mit der while Schleife etc. vergiss es mal.
Brauchst Du nicht, da bei der bekannten Abfrage mit select count(*)
nur ein Ergebnis also eine Zeile entsteht.
Es sieht dann so aus:
$result = mysql_query("SELECT count(*) FROM table");
$anzahl_1 = mysql_result($result,1, 1);
Gruss Matze
PS Das habe ich grad mal schnell im SelfPHP nachgelesen.
Moin,
Meinst du mit "Du musst das Ergebnis aus der Abfrage nehmen." das ich den Wert uweisen soll?
Ich habs mit:
$counter = mysql_query("SELECT COUNT(*) AS num_id FROM $db_table");
#$num_id = mysql_num_rows($counter);
echo "$num_id";
probiert.
Er zeigt mir dann aber 0 (Null) an.
Das könnte nicht zufällig daran liegen dass du die einzige Zeile in der an $num_id ein Wert zugewiesen werden könnte, auskommentiert hast? (Jaja, es ist spät und so)
Also noch mal von vorne: Mit SELECT gibt die Datenbank immer eine Tabelle zurück in der die angefragten Daten enthalten sind. Das SELECT COUNT(*) ... gibt zwar nur einen einzigen Wert zurück, das wird dann aber einfach eine Tabelle mit nur einer Spalte und einer Zeile. Diese Tabelle geht jetzt von der Datenbank an den MySQL-Interfacecode im PHP-Interpreter und ist dort hinter der Ressource die du in $counter gespeichert hast verfügbar. Also: $counter ist nur eine Art Zeiger auf einen Speicherbereich in dem der PHP-Interpreter das Ergebnis der Anfrage (die genannte Tabelle) gespeichert hat. Deshalb kann schonmal nichts allzu sinnvolles rauskommen wenn du direkt mit $counter arbeitest.
Um jetzt an die Daten ranzukommen, musst du die PHP-Funktionen benutzen die dich die Daten aus diesem Speicherbereich auslesen lassen. Eine dieser Funktionen ist mysql_num_rows(), welches die Anzahl der Zeilen in der zurückgegebenen Tabelle angibt. Wie oben besprochen ist da aber immer nur eine Zeile drin, also bringt dir das auch nichts. Du brauchst so etwas wie mysql_fetch_row() welches dir jeweils eine Zeile aus dieser Tabelle als Array zurückgibt und sehr praktisch ist, wenn du vorher nicht weisst wieviele Zeilen es sein werden.
Da du hier aber weisst, dass es genau eine Zeile mit einer Spalte ist, kannst du auch direkter rangehen, zum Beispiel mit mysql_result(), welches dir nur den Inhalt einer Zelle gibt.
$num_id = mysql_result($counter, 0);
sollte tun was du willst. (Obwohl mich Matze da ein wenig verunsichert hat ob da nicht 1 statt 0 stehen müsste. In der Doku ist das nicht erwähnt und in den Kommentaren zur Doku wird 0 benutzt.)
Servus,
sollte tun was du willst. (Obwohl mich Matze da ein wenig verunsichert hat ob da nicht 1 statt 0 stehen müsste. In der Doku ist das nicht erwähnt und in den Kommentaren zur Doku wird 0 benutzt.)
das Kommentierte Stück habe ich völlig übersehen schande....
Ausserdem habe ich von wegen bei eins Anfagen ja auch gesagt, dass das bei Java so ist und nicht unbedingt auch bei PHP so sein muss.
Nur eine Frage die Methode mysql_num_rows gibt bei einem
Select count(*) ebenfalls nicht eins sondern alle betroffenen Spalten an?
Ausserdem hat er mich mit noch einer aktion raingelegt. as sonstwas Id.
Da hat er dann eine Liste im result set wie:
13, 1
13, 2
13, 3 usw.
Gruss Matze
Servus,
ein Nachtrag:
Unter Java grad mal ausprobiert und getestet.
So würde meine Funktion theoretisch aussehen:
sql_query="select count(*) from tabelle where userid = 9";
result_set= sql_query.execute();
So nun der Teil den ich bei dir anderster vorfinde als erwartet:
while(result_set)
{
anzahl = result_set[1];
}
Sowas wie die While Schleife habe ich vermisst, wo Du das Ergebnis der Abfrage ermittelst.
Den Code musst Du nun an PHP anpassen . PHP ist nicht meine Welt ander Stelle.
Die eins im Array des Resultset muss im Java imme beim 1 Beginnen und nicht wie gewonnt bei normalen Array bei 0.
ch weiss nicht ob dies bei PHP auch so ist.
Hier die Zahle 1 hart zu codieren ist kein Problem wenn auch unschön. Diese Schleife durchläuft nur einmal da es nur einen einzigen Result set gibt.
Gruss Matze
PS. wenn Deine verwendete PHP funktion exact das macht was ich oben Beschrieben habe, dann hast Du auch nur 10 Datensätze drin.
sql_query="select count(*) from tabelle where userid = 9";
result_set= sql_query.execute();So nun der Teil den ich bei dir anderster vorfinde als erwartet:
while(result_set)
{anzahl = result_set[1];
}
Die while-Schleife ist ja gar net nötig. num_rows überprüft, wieviel Datensätze von meiner SELECT-Anweisung betroffen sind. Und wenn ich ein * angebe, sind es alle. Somit hätte ich rein theoretisch die Anzahl der Einträge.
Aber ich bekomme halt 130 und nicht 13.
Heureka! Da laust sich der Affe, das kann doch nciht wahr sein.
Jetzt funktioniert es.
Verdammte %+@§#&? nochmal, das kann doch nciht angehen!
Ich danke dir (besonders bei dieser Uhrzeit ^^)!!!
Servus,
würdest Du noch das Ergebniss Posten?
Danke Gruss Matze
Klar, der Fehler mit der 130 kommt daher, weil meine if-Anweisung aus irgend einem Grund eine 0 (Null) ausgibt.
Weißt du vielleicht warum?
$query = "SELECT * FROM $db_table";
$result = @mysql_query($query);
$num_id = mysql_num_rows($result);
echo "$num_id<br>";
if($num_id > $shout_archive)
{
$difference = ($num_id-$shout_archive);
echo "$difference<br>";
}
Das die Null ausgegeben wird, liegt aber nicht an der if-Anweisung. Kommt auch von keinem echo. WTF!?
Versuch einfach diesen Code:
$result = mysql_query("SELECT count(*) FROM table");
$anzahl_1 = mysql_result($result,1, 1);
Nur musst du probieren, ob Du die letzte Zeile so:
$anzahl_1 = mysql_result($result,0, 0);
oder so
$anzahl_1 = mysql_result($result,0, 1);
oder so
$anzahl_1 = mysql_result($result,1, 0);
lauten muss. Ich tippe hoerbei auf 0,0 laut einer Aussage vom... wie hies er nochmals..
Gruss Matze
$result = mysql_query("SELECT count(*) FROM table");
$anzahl_1 = mysql_result($result,0, 0);
Funktioniert, er hängt wieder eine 0 hinten ran. :(
Hab übrigens folgendes gefunden:
http://www.little-idiot.de/mysql/mysql-126.html
Wie übersetzt man das ganze in PHP, dass ich dann nur noch die Zahl kriege?
Letzter Versuch,
$result = mysql_query("SELECT count(*) FROM table");
$anzahl_1 = mysql_result($result,0);
Gruss Matze
$result = mysql_query("SELECT count(*) FROM table");
$anzahl_1 = mysql_result($result,0);
Nö, mag er nicht. Da fehlt die letzte Null ;)
"You have an error in your SQL syntax near 'table' at line 1"
Nö, mag er nicht. Da fehlt die letzte Null ;)
"You have an error in your SQL syntax near 'table' at line 1"
Ich depp, hätte mal anpasse sollen.
Er gibt 13 aus (ist richtig) + die Null am Ende.
*heul*
Sevus,
mal ganz dumm gefragt, Du hast schon bei folgendem Script:
$result = mysql_query("SELECT count(*) FROM table");
$anzahl_1 = mysql_result($result,0);
table durch den Tabellenamen erstzt bitte keinen Include Variable codier den Tabellenname hart rein.
Kann mysql den Befehl count(*) nicht??
Gruss Matze
table durch den Tabellenamen erstzt bitte keinen Include Variable codier den Tabellenname hart rein.
Kann mysql den Befehl count(*) nicht??
Ist im Endeffekt doch egal, funktioniert so oder so.
Mit COUNT(*) funzt es doch, aber eben auch mit einer Null (zusätzlich). Wenn ich ein Break einfüge (< br >) geht die Null in die nächste Zeile (wird also nciht zusammengeschustert). Irgendetwas gibt da was aus, was nix ausgeben soll...;)
Ich hab den Fehler:
echo mysql_errno();
Ok, ich weiß, ich bin ein Vollidiot...Sry
Und ein riesiges DANKE an euch alle!
Ich geh jetzt pennen...^^
Jetzt schon schlafen, dabei ist doch die Lösung so nahe.
Gruss matze
siehe Posting eins weiter oben.
Und was bewirkt der code??
Er unterbindet doch nur die SQL error ausgabe oder?
Das löst jedoch nicht Dein Problem...oder doch ?!?
Gruss matze
Moin,
Er unterbindet doch nur die SQL error ausgabe oder?
Nein.
Das löst jedoch nicht Dein Problem...oder doch ?!?
Doch. Das gibt die Nummer des zuletzt aufgetretenen Fehlers in der MySQL-Verbindung aus. Kein Fehler -> 0.
Servus,
ich hab schon gesehen... ich bleibe bei Perl und Java grins.
Gruss Matze
Servus,
also mein Fehler wenn bei Java etwas nicht logisch ist solle man nicht davon ausgehen dass es woanderster auch so ist.
$db = @MYSQL_CONNECT($db_server,$db_user,$db_passwort);
$db_select = @MYSQL_SELECT_DB($db_name);
$result = mysql_query("SELECT count(*) FROM tabelle");
$row = mysql_fetch_row($result))
anzahl = $row[0];
Gruss Matze
Wenn dauch auch wieder 130 statt 13 raus kommt bin ich echt überfragt und müsste mich wohl an Deinen Rechner setzen.
Gruss Matze
Guck mal einen Post weiter runter...
Hab den Fehler gefunden!
Moin,
$result = mysql_query("SELECT count(*) FROM table");
$anzahl_1 = mysql_result($result,0);Nö, mag er nicht. Da fehlt die letzte Null ;)
Nein fehlt sie nicht. Das dritte Argument von mysql_result() ist ausdrücklich optional.
"You have an error in your SQL syntax near 'table' at line 1"
Diese Meldung kommt offensichtlich vom SQL-Interpreter, nicht von PHP. Sie sagt dass in deiner SQL-Anweisung etwas nicht in Ordnung sei. (table existiert nicht, vermutlich.)
Ok das war eigentlich zu erwarten.
Gruss Matze
Puhhh Du hast ein Problem, mit dem Ich gar nicht mehr weiss wo ich suchen soll, da es ja eigentlich gehen müsste.
Mache ich ja auch nicht anderster mit der Abfrage.
Wenn das nun auch nicht geht, dann mach folgendes:
Codiere bite hart ohne invludes das kannst Du dann später wieder tun.
$db = @MYSQL_CONNECT($db_server,$db_user,$db_passwort);
$db_select = @MYSQL_SELECT_DB($db_name);
$result = mysql_query("SELECT count(*) FROM tabelle");
$row = mysql_fetch_row($result))
anzahl = $row[1];
übrigens den SQL String musst Du mit
echo und nicht print ausgeben lassen.
Wenn das auch nicht klappt, gebe ich ganz ehrlich auf und werde nie wieder zu PHP Threads antworten auch wenn es sich nach SQL anhört.
$result = mysql_query("SELECT count(*) FROM tabelle");
$row = mysql_fetch_row($result))
anzahl = $row[1];
Da krieg ich nix, nur ne 0...
Moin,
Da krieg ich nix, nur ne 0...
Die 1 muß auch eine 0 sein.
Servus,
müsste es dann so heissen:
$db = @MYSQL_CONNECT($db_server,$db_user,$db_passwort);
$db_select = @MYSQL_SELECT_DB($db_name);
$result = mysql_query("SELECT count(*) FROM tabelle");
$row = mysql_fetch_row($result))
anzahl = $row[0];
???
Dann bekinnt bei PHP der Result Vector auch bei 0 wie es eigentlich logischerweise sein sollte. Bei Java ist es Partu bei Resultsets anderster.
Gruss Matze
Moin,
müsste es dann so heissen:
[snip]
Dann bekinnt bei PHP der Result Vector auch bei 0 wie es eigentlich logischerweise sein sollte.
Ja. Ja.
Servus,
ich hatte es ja eigentlich vermutet aber in der SelfPHP Doku steht in dem Beispiel dazu result[1].
Klasse Doku. Mit meinem Java Wissen ging ich davon aus, dass es sich gleichfalls verhält.
Gruss Matze
Ja weil er $db_table so nicht kennt Du hast bestimmt keine Tabelle mit dem namen $db_table.
Wenn Du den Namen aus einer Variablen in das SQL Statement einbinden möchtest solltest Du das so machen.
$query = "SELECT * FROM " +$db_table;
Gruss Matze jetzt bekommst Du aber nur eine 1 und nicht die Zahl der tatsächlichen Spalten bzw. nicht das Ergebnis aus Select count(*).
Gruss Matze
Ja weil er $db_table so nicht kennt Du hast bestimmt keine Tabelle mit dem namen $db_table.
Nee, hab oben ein include, das geht schon alles klar. Ich frag mich nur, wo die Null herkommt.
Was sagt die SQL Fehlermeldung?
Gibt es da was??
Achja und mach mal am ende ein "print(sql_query); und schau mal ob in dem String wirklich das drin steht was Du haben möchstest.
Gruss Matze
Was sagt die SQL Fehlermeldung?
Gibt es da was??
Nö, alles sauber.
Achja und mach mal am ende ein "print(sql_query); und schau mal ob in dem String wirklich das drin steht was Du haben möchstest.
Funktioniert imo nicht.
Tust Du mir einen gefallen,
bleib doch bitte in einem Thread sonst müsste ich immer doppelt Posten.
Gruss Matze
Tust Du mir einen gefallen,
bleib doch bitte in einem Thread sonst müsste ich immer doppelt Posten.
Ich mach doch gar nix :-?
Tust Du mir einen gefallen,
bleib doch bitte in einem Thread sonst müsste ich immer doppelt Posten.
Ich mach doch gar nix :-?
http://forum.de.selfhtml.org/faq/#Q-04.
Danke.
Servus,
die bitte hat sich darauf bezogen, dass er ständig vom oberen zum untern Zwei seines Postings gewechset ist nudnwurd wohl entsprechend verstanden.
Gruss matze
PS. Wer immer und gerne unsinniger weise auf die FAQ verweisst wird bad nicht mehr ernst genommen.