myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Webmaster Talk > Entwicklung & Programmierung
Seite neu laden

[PHP] Warum funktioniert die Datenabfrage nicht ?

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 21.05.13, 16:54   #1
Jerryoh
Anfänger
 
Registriert seit: Feb 2013
Beiträge: 10
Bedankt: 0
Jerryoh ist noch neu hier! | 0 Respekt Punkte
Standard [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
Jerryoh ist offline   Mit Zitat antworten
Ungelesen 22.05.13, 05:16   #2
kkhamburg
Profi
 
Benutzerbild von kkhamburg
 
Registriert seit: May 2009
Ort: riding the roos
Beiträge: 1.468
Bedankt: 1.057
kkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punkte
Standard

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"] . '"'
__________________

[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]


kkhamburg ist offline   Mit Zitat antworten
Ungelesen 23.05.13, 01:17   #3
Jerryoh
Anfänger
 
Registriert seit: Feb 2013
Beiträge: 10
Bedankt: 0
Jerryoh ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von kkhamburg Beitrag anzeigen
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>
Jerryoh ist offline   Mit Zitat antworten
Ungelesen 23.05.13, 21:17   #4
kkhamburg
Profi
 
Benutzerbild von kkhamburg
 
Registriert seit: May 2009
Ort: riding the roos
Beiträge: 1.468
Bedankt: 1.057
kkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punktekkhamburg leckt gerne myGully Deckel in der Kanalisation! | 594749 Respekt Punkte
Standard

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.
__________________

[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]


kkhamburg ist offline   Mit Zitat antworten
Ungelesen 26.05.13, 13:32   #5
thomy68
Anfänger
 
Registriert seit: Aug 2012
Beiträge: 13
Bedankt: 13
thomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punkte
Standard

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);
    }

thomy68 ist offline   Mit Zitat antworten
Ungelesen 31.05.13, 10:17   #6
Pornstar_
Anfänger
 
Registriert seit: Feb 2012
Beiträge: 9
Bedankt: 3
Pornstar_ ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Pornstar_ ist offline   Mit Zitat antworten
Ungelesen 31.05.13, 11:21   #7
thomy68
Anfänger
 
Registriert seit: Aug 2012
Beiträge: 13
Bedankt: 13
thomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punktethomy68 ist unten durch! | -114636 Respekt Punkte
Standard

Zitat:
Zitat von Pornstar_ Beitrag anzeigen
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.

thomy68 ist offline   Mit Zitat antworten
Ungelesen 20.06.13, 21:52   #8
Jerryoh
Anfänger
 
Registriert seit: Feb 2013
Beiträge: 10
Bedankt: 0
Jerryoh ist noch neu hier! | 0 Respekt Punkte
Standard

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
Jerryoh ist offline   Mit Zitat antworten
Antwort


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

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.


Sitemap

().