Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
|
21.05.13, 16:54
|
#1
|
Anfänger
Registriert seit: Feb 2013
Beiträge: 10
Bedankt: 0
|
[PHP] Warum funktioniert die Datenabfrage nicht ?
Hallo zusammen,
also ich versuche gerade anhand des Buches "Einstieg in PHP 5.4 und MySQL 5.5" ein wenig php zu erlernen. In dem Buch gibt es eine Lektion mit dem Titel "Ändern eines bestimmten Datensatzes". Folgender Ablauf:
· Dem Benutzer werden alle Datensätze angezeigt (a.php).
· Er wählt denjenigen Datensatz aus, den er ändern möchte (a.php).
· Der gewählte Datensatz wird in einem Formular angezeigt (b.php).
· Der Benutzer gibt die Änderungen ein und führt sie aus (b.php -> c.php).
Zum Problem: Nachdem ein Datensatz in a.php ausgewaählt wurde und der submit button geklickt wurde öffnet sich b.php soweit so gut. Nun sollten jedoch in den Eingabe-Feldern bereits Werte drin stehen bzw. : hersteller, typ, gb ... , weil dies ja mit den Values (die ihren inhalt aus einer sql-abfrage beziehen) so festgelegt sein sollte.
Ist aber leider nicht der Fall. Statt dessen die Warnung:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\www\b.php on line 15
Damit kann ich nur irgendwie nich so viel anfangen ... Fehlerbehandlung kommt auch erst s viel später im Buch dran ^^ . Nein, mahl ernsthaft, ich glaube das ich wiedermahl irgendwo ein punkt oder ähnliches nicht gesetzt habe, weswegen wieder das gesammte Programm nicht läuft.
Hoffe wirklich das mir einer nen guten tipp geben kann, habs mir auch natürlich selber schon etwa zehn mahl durchgelesen aber nichts gefunden, weis aber das es eigendlich klappen sollte weil, ein im prinzip selbes aus dem buch -fehler frei- funtioniert.
a.php
PHP-Code:
<html> <head> <meta charset="utf-8"> </head> <body> <p>Wählen Sie aus, welcher Datensatz geändert werden soll:</p> <form action = "b.php" method = "post"> <?php mysql_connect("","root"); mysql_select_db("hardware"); $res = mysql_query("select * from fp"); $num = mysql_num_rows($res); // Tabellenbeginn echo "<table border='1'>"; // Überschrift echo "<tr><td>Auswahl</td><td>Hersteller</td><td>Typ</td>"; echo "<td>GB</td> <td>Preis</td>"; echo "<td>Artikelnummer</td> <td>Datum</td> </tr>"; while ($dsatz = mysql_fetch_assoc($res)) { echo "<tr>"; echo "<td><input type='radio' name='auswahl'"; echo " value='" . $dsatz["artnummer"] . "' /></td>"; echo "<td>" . $dsatz["hersteller"] . "</td>"; echo "<td>" . $dsatz["typ"] . "</td>"; echo "<td>" . $dsatz["gb"] . "</td>"; echo "<td>" . $dsatz["preis"] . "</td>"; echo "<td>" . $dsatz["artnummer"] . "</td>"; echo "<td>" . $dsatz["prod"] . "</td>"; echo "</tr>"; } // Tabellenende echo "</table>"; ?> <p><input type="submit" value="Datensatz anzeigen" /></p> </form> </body> </html>
b.php
PHP-Code:
<html> <head> <meta charset="utf-8"> </head> <body> <?php if (isset($_POST["auswahl"])) { mysql_connect("","root"); mysql_select_db("hardware"); $sqlab = "select * from fp where artnummer = " . $_POST["auswahl"]; $res = mysql_query($sqlab); $dsatz = mysql_fetch_assoc($res); echo "<p>Führen Sie die Änderungen durch,<br />"; echo "betätigen Sie anschließend den Button</p>"; echo "<form action = 'c.php' method = 'post'>"; echo "<p><input name='her' value='" . $dsatz["hersteller"] . "' /> Hersteller</p>"; echo "<p><input name='typ' value='" . $dsatz["typ"] . "' /> Typ</p>"; echo "<p><input name='gb' value='" . $dsatz["gb"] . "' /> GB</p>"; echo "<p><input name='pre' value='" . $dsatz["preis"] . "' /> Preis</p>"; echo "<p><input name='art' value='" . $_POST["auswahl"] . "' /> Artikelnummer</p>"; echo "<p><input name='pro' value='" . $dsatz["prod"] . "' /> Geburtstag</p>"; echo "<input type='hidden' name='oriart' value='" . $_POST["auswahl"] . "' />"; echo "<p><input type='submit' value='Anderungen in Datenbank speichern' />"; echo " <input type='reset' /></p>"; echo "</form>"; } else echo "<p>Es wurde kein Datensatz ausgewählt</p>"; ?> </body> </html>
c.php
PHP-Code:
<html> <head> <meta charset="utf-8"> </head> <body> <?php mysql_connect("","root"); mysql_select_db("hardware"); $sqlab = "update fp set" . " hersteller = '" . $_POST["her"] . "'," . " typ = '" . $_POST["typ"] . "'," . " gb = " . $_POST["gb"] . "," . " preis = " . $_POST["pre"] . "," . " artnummer = '" . $_POST["art"] . "'" . " prod = '" . $_POST["pro"] . "'" . " where artnummer = " . $_POST["oriart"]; mysql_query($sqlab); $num = mysql_affected_rows(); if ($num>0) echo "<p>Der Datensatz wurde geändert</p>"; else echo "<p>Der Datensatz wurde nicht geändert</p>"; ?> <p>Zurück zur <a href="a.php">Auswahl</a></p> </body> </html>
... warum mussn das so kompliziert sein
|
|
|
22.05.13, 05:16
|
#2
|
Profi
Registriert seit: May 2009
Ort: riding the roos
Beiträge: 1.468
Bedankt: 1.057
|
Zum einen solltest du dich dringend mit dem Thema Mysql Injections auseinandersetzen.
Und dann ändere mal folgendes in der b.php:
Statt
PHP-Code:
$sqlab = "select * from fp where artnummer = " . $_POST["auswahl"];
dies
PHP-Code:
$sqlab = 'select * from fp where artnummer = "' . $_POST["auswahl"] . '"';
|
|
|
23.05.13, 01:17
|
#3
|
Anfänger
Registriert seit: Feb 2013
Beiträge: 10
Bedankt: 0
|
Zitat:
Zitat von kkhamburg
Zum einen solltest du dich dringend mit dem Thema Mysql Injections auseinandersetzen.
|
Ich hoffe du meinst damit nur, dass das s***** derzeit keine passwort zur Datenbank benötigt, das würde ich natürlich noch setzen.
Ja und dein Tipp stimmte, das Feld überträgt einen String und der muss in hochkommata, im nachhinein irgendwie logisch ^^ , danke dafür.
Nur leider läufts noch nicht richtig. Es kommt immer die Meldung "Der Datensatz wurde nicht geändert"
Ich vermute das die SQL-Anweisung in c.php von mir nicht richtig zusammen gesetzt wurde, bin mir aber nicht ganz sicher ...
Wäre echt cool wenn du vieleicht noch mahl nen kurzen blick drauf werfen könntest, hab auch dazu geschrieben was ich geändert hab.
c.php
PHP-Code:
<html> <head> <meta charset="utf-8"> </head> <body> <?php mysql_connect("","root"); mysql_select_db("hardware");
$sqlab = "update fp set" . " hersteller = '" . $_POST["her"] . "'," . " typ = '" . $_POST["typ"] . "'," . " gb = " . $_POST["gb"] . "," . " preis = " . $_POST["pre"] . "," . " artnummer = '" . $_POST["art"] . "'," // Komma hinzugefügt . " prod = '" . $_POST["pro"] . "'" . " where personalnummer = '" . $_POST["oriart"] . "'"; // Hochkommatas hinzugefügt mysql_query($sqlab);
$num = mysql_affected_rows(); if ($num>0) echo "<p>Der Datensatz wurde geändert</p>"; else echo "<p>Der Datensatz wurde nicht geändert</p>"; ?> <p>Zurück zur <a href="a.php">Auswahl</a></p> </body> </html>
|
|
|
23.05.13, 21:17
|
#4
|
Profi
Registriert seit: May 2009
Ort: riding the roos
Beiträge: 1.468
Bedankt: 1.057
|
Ich würde dir ja auch da helfen, hab aber ehrlich gesagt keinen Bock dieses Sammelsurium aus zusammengesetzten Textteilen zu entwirren.
Lass dir doch mal am Anfang alle übergebenen Variablen ausgeben um zu sehen was dort drinsteht.
Zur SQL Injection solltest du bitte mal Google benutzen, das Thema ist so breitgetreten das ich es hier nicht nochmal komplett ausführe.
Nur soviel, es geht nicht um das Passwort.
|
|
|
26.05.13, 13:32
|
#5
|
Anfänger
Registriert seit: Aug 2012
Beiträge: 13
Bedankt: 13
|
PHP-Code:
$sqlab = "update fp set hersteller = '" . $_POST["her"] . "', typ = '" . $_POST["typ"] . "' , gb = " . $_POST["gb"] . ", preis = " . $_POST["pre"] . ", artnummer = '" . $_POST["art"] . "', prod = '" . $_POST["pro"] . "' where artnummer = '" . $_POST["oriart"] . "'";
1. benutze "google" und "php.de" zur fehlersuche und für best practices
2. machs nicht komplizierter, als es ist => deine stringaufsplittungen mit "."
3. gewöhne dir bereits beim lernen an, konsequente bzw. durchgängige var-namen zu vergeben => das ist ja kraut und rüben mit feld- und varnamen -> siehe deinen fehler anstatt artnummer => personalnummer
4. nutze die o.g. s*****e nur zum lernen und nicht produktiv - ansonsten säubere deine daten, bevor du sie in einer sql-query verwurstest - siehe bereits angesprochenes thema "SQL Injection".
eine möglichkeit ist zum beispiel (!!) am anfang eines s*****s die vars zu cleanen:
PHP-Code:
if (is_array($_POST)) { foreach ($_POST as $key => $value) { $_POST[$key] = mysql_real_escape_string($value); } }
|
|
|
31.05.13, 10:17
|
#6
|
Anfänger
Registriert seit: Feb 2012
Beiträge: 9
Bedankt: 3
|
Parameter zu mysql_connect sollten string $host, string $username, string $passwort, string $database sein
Soweit ich sehe, versuchst du dich mit leerem Benutzernamen und Passwort "root" anmelden, da aber ein Username kein boolscher Wert sein darf ("" ist ein leerer String und somit false), gibt es dir den Fehler.
Achja, wenn du XAMPP installiert hast, hast du von Haus aus das mysqli-Modul installiert, benutzt das anstatt dem 'normalen' MySQL.
Naja, wenn du OOP magst, dann mach es so wie oben, ansonsten bleib bei MySQL.
|
|
|
31.05.13, 11:21
|
#7
|
Anfänger
Registriert seit: Aug 2012
Beiträge: 13
Bedankt: 13
|
Zitat:
Zitat von Pornstar_
Parameter zu mysql_connect sollten string $host, string $username, string $passwort, string $database sein
Soweit ich sehe, versuchst du dich mit leerem Benutzernamen und Passwort "root" anmelden, da aber ein Username kein boolscher Wert sein darf ("" ist ein leerer String und somit false), gibt es dir den Fehler.
Achja, wenn du XAMPP installiert hast, hast du von Haus aus das mysqli-Modul installiert, benutzt das anstatt dem 'normalen' MySQL.
Naja, wenn du OOP magst, dann mach es so wie oben, ansonsten bleib bei MySQL.
|
naja - nicht ganz
grundsätzlich hast du recht, das der saubere und vor allem sichere stil ein vollständiges ausfüllen der parameter voraussetzt.
jedoch bringst du ein paar dinge durcheinander
1. da die function mysql_connect strings als parameteraufruf erwartet bzw. sie bei aufruf in ein string wandelt, ist ein "" nicht boolsch (true/false) sondern "empty" bzw. NULL. somit ist hostname standardmässig localhost:3306 - ausser in der php.ini steht was anderes als default.
2. grundsätzlich werden parameter in funktionsaufrufen von "links nach rechts" mit kommatrennung übergeben. hostname hat er ja als "" angegeben, somit kommt "root" als user korrekt als nächstes. die restlichen parameter werden default bzw. leer belegt.
|
|
|
20.06.13, 21:52
|
#8
|
Anfänger
Registriert seit: Feb 2013
Beiträge: 10
Bedankt: 0
|
Hab mahl eben den Titel des Themas umbenannt, weil ich schon selber durcheinander komme wenn ich alle meine Thmen mit "Anfänger braucht einen Tipp" betitel
Zum Thema:
Thomy68 hat recht, ist aber ein wenig untergegangen, anstatt artnummer, habe ich durch zu viel C&P personalnummer eingetragen, nach dem ändern funktionierte es dann alles.
MFG
Jerryoh
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 Uhr.
().
|