PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : resource id#4



johnpatcher
05-01-2004, 14:41
hi, ich hab folgendes script:



<?php

include "../checkuser.php";

// Values von change_user_main.php und die UserID

$oldpwd = $_POST["oldpwd"];
$newpwd = $_POST["newpwd"];
$newpwd1 = $_POST["newpwd1"];
$userid = $_SESSION["user_id"];

//Verbindung mit der Datenbank aufbauen

//hier die informationen die php braucht ...

$server = "127.0.0.1";
$user = "xxx";
$password = "xxx";
$database = "xxx";

//Hier die verbindung

$conn = @mysql_connect($server, $user, $password);
if (!$conn)
{
echo echoerror();
}

//Hier wird die Datenbank ausgewählt

$db = mysql_select_db($database, $conn);
if (!$db)
{
echo echoerror();
}

//Überprüfen ob Felder leer sind und wenn nicht,
//Überprüfen ob $newpwd nicht gleich $oldpwd ist
//wenn ja Fehlerausgaben!

if($oldpwd == "" or $newpwd == "" or $newpwd1 == "")
{
echo "Bitte f&uuml;llen Sie alle Felder aus<br>";
}
else
{
if(($newpwd === $newpwd1) && ($newpwd !== $oldpwd))
{
echo "<br>";
}
if($newpwd !== $newpwd1)
{
echo "Die zwei neuen Passw&ouml;rter sind nicht gleich! Bitte korigieren Sie Das<br>";
}
if(($oldpwd === $newpwd) && ($oldpwd === $newpwd1))
{
echo "Das neue und das alte Password ist gleich! KEINE &Auml;nderung!<br>";
}
}

//Überprüfen, ob $oldpwd = altes password,
//wenn ja, weiter
//wenn nicht stopp!

$sql = "SELECT Kennwort FROM benutzerdaten WHERE ID = $userid";
$i = mysql_query ("$sql");
echo "$i";
?>


der obere teil enthält ein include, der überprüft ob man berechtigt ist die datei auszuführen. dann kommen ein paar variablen, die die values von einem formular auslesen, dann ein paar überprüfungen und beim der sql abrage bekomme ich den fehler:

"Resource id #4"

woran kann das liegen? wenn ich den befehl in phpmyadmin eingeben funzt es einwandfrei! natürlich muss ich dann stat " WHERE ID = $userid";", die id einsetzten doch an dieser variablen kann es nicht liegen, da ich sie ausgeben kann!! bitte helft mir!!

johnpatcher

Gaert
05-01-2004, 16:38
Hallo!

Das ist keine Fehlermeldung, sondern ganz Korrekt die Ressource ID deiner Abfrage, die du dann an mysql_fetch_array() oder mysql_fetch_object() weiterreichen musst.

Torsten.E
07-04-2004, 12:17
$result = my_sqlquery("bla bla....")

Das Ergebnis in $result ist ja die Resource ID
also der Verweis auf das Ergebnis in MySQL.

Kann ich diese Variable $result auch an andere
Programme weitergeben um mit dem Ergebnis
weiterarbeiten ? Wenn ja, wie lange bleibt
das Ergebnis in mysql erhalten, bis es "verworfen"
wird.

Torsten.E

Torsten.E
07-04-2004, 12:18
natürlich hier nur verschrieben, sorry

Torsten.E

Gaert
07-04-2004, 12:45
Hallo Thorsten,

1.
Die Ressource ID ist eine ID, die vom PHP MySQL Modul als interne Kennung erzeugt wird. Andere Programme können damit nichts anfangen, weil MySQL von dieser ID keine Kenntnis hat.

2.
Die MySQL Datenbank merkt sich das Ergebnis des Queries lediglich im internen cache... von deiner Ressource ID weiß es ja nichts.
Ist auch nicht nötig, denn sämtliche Ergebnisse wurden bereits direkt nach dem Query an das PHP Modul weitergegeben und dort gecached. Aus diesem cache wird dann z.B. über mysql_fetch_array() "gefetcht". Überprüfen kannst du das, indem du einfach nach dem Query die Verbindung zur Datenbank schließt... die Daten kannst du trotzdem noch über ein fetch auslesen.

Beispiel:


<?php
$link = mysql_connect("localhost","root","");
mysql_select_db("test",$link);
$res = mysql_query("select * from tabelle");
mysql_close($link);
print_r(mysql_fetch_array($res));
?>

-----

Wir lernen daraus: Nur die Daten über das Query selektieren, die wir später auch wirklich benötigen... alles andere holt sich PHP unnötig aus der Datenbank!

Hoffe es ist ein wenig klarer geworden,

Gruß,

Gaert

Torsten.E
07-04-2004, 12:53
Hmmm... das habe ich verstanden.

Dann muß ich doch mal fragen, wie groß kann den dann der Cache
sein. Beispiel ich bekomme als Ergebnis sagen wir mal 300-700 Adressen,
das kann dan schon speicherfressend werden, wenn mehrere das PHP-Modul
nutzen.

Wie händelt man sowas am geschicktesten.

Torsten.E

Gaert
07-04-2004, 14:20
Da kann ich dir im Moment leider auch keine Antwort geben... wenn du etwas C kannst, kannst du auchmal im Modul Quelltext danach suchen - ich persönlich hab noch nicht nachgeschaut... man hat mir oben geschriebenes nur mal so erklärt.
700 Adressdatensätze sind aber eigentlich noch harmlos - interessant wirds erst ab einer Million ;)

Torsten.E
07-04-2004, 14:26
Es get halt darum, dass ich eine Adress-Suche habe, und im Suchergebnis
der Benutzer nachtürlich "blättern" kann. Da fragt sich halt, wie groß macht
man dann so ein "Blätterbereich" ohne dass dem Server gleich der Speicher
rausfliegt, oder das Zeug so langsam wird, dass der User die Seite
verläßt, was ja keiner will.

Bei jedem Aufruf der Seite muß natürlich die Suche wieder durchlaufen
werden. Deshalb überhaupt die Frage, ob man das Suchergebnis nicht
zwischenspeichern kann, um es für die Blättern-Funktion zu benutzen.

Torsten.E

Gaert
07-04-2004, 14:33
Mooment...

Wenn du eine Suche machst mit:

SELECT VORNAME, NACHNAME, STRASSE WHERE VORNAME = 'Max';

dann erhälst du ja keine 700 Ergebnisse - es sei denn du hast 700 Maxes in deiner Tabelle.

Und selbst wenn: so ein Datensatz belegt nur ein paar Byte Speicher.

Im Übrigen bietet sich bei vielen Ergebnissen das Blättern an (wie du es vor hast), und dann machst du eh z.B. ein LIMIT 0, 30 ans Ende, wenn du nur 30 Datensätze pro Seite haben willst - mehr bekommst du dann auch nicht!.

Wenn du natürlich auf ne Tabelle mit drei Millionen Datensätzen und Zehntausend Feldern immer ein SELECT * FROM machst, und nur fünf Felder der ersten 20 Datensätze darstellen willst, dann solltest du erstmal lernen richtige Abfragen zu schreiben...

Und ich sags nochmal... wegen 700 Popeldatensätzen brauchst du dir keine Sorgen zu machen.

Torsten.E
07-04-2004, 14:36
Das Limit zum blättern sollte schon höher liegen.

Zeig mir alle Adressen aus München, da kommt gleich mal ne Anzahl
zusammen. Jetzt dachte ich halt, dass das Limit auf 300 stegt. D.h.
mit 5-10 Adressen pro Anzeige kann er dann so 30 Seiten vorwärts/rückwärts
blättern.

Oder ist sowas schon zuviel.

Torsten.E

Gaert
07-04-2004, 14:42
Du denkst zu kompliziert!


<?php
$page = $_GET['page'];
$query = "SELECT * FROM xyz WHERE city = 'Muenchen' LIMIT ". ($page-1) * 15 . ",15"
...
?>


Fertig...

Immer nur 15 Datensätze und du kannst blättern wohin du willst!

Torsten.E
07-04-2004, 14:52
Jo Gaert, so mach ich es auch bis jetzt schon.

Nur wird halt vor der "limitierten" Abfrage noch einmal
"ganz München" abgefragt, damit ich die Gesamtzahl der
Daten habe um die Anzahl der Seite zu berechnen.

Klar kann ich die Gesamtzahl auch nur einmal abfragen
und solange diese Variable einfach nur benutzen.

Torsten.E

Gaert
07-04-2004, 15:00
Alles klar ;) ...

Kleiner Tip:
Schonmal was von count() gehört?



$query = "SELECT count(*) as total FROM xyz WHERE city = 'Muenchen'";
...
$page = $_GET['page'];
$query = "SELECT * FROM xyz WHERE city = 'Muenchen' LIMIT ". ($page-1) * 15 . ",15"
...


Gruß,

Gaert

Torsten.E
07-04-2004, 15:03
für die kleinen Tips, die das Leben leichter machen.

Kastenbier = "SELECT count(*) as total FROM keller WHERE inhalt="weizen";


Torsten.E

Gaert
07-04-2004, 15:09
Aah... da kann jemand Gedanken lesen!