5.2k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von boma Einsteiger_in (27 Punkte)
Hallo Leute

nach mehreren Stunden probieren und googlen hier meine erster Post. Sehr wahrscheinlich nicht richtig gesucht, wenn ich nur wüsste was genau... Ich mache seit ein paar Tagen meine ersten Schrite mit php, bitte um Nachsicht.


<?php
echo "
<form method='post' action='saprunbookquery.php'>
<input name='jnquery' type='text' size='50' maxlength='50'>
<input type='submit' class='button1' value='Go!' name='button1' />
</form>
";
$jnquery=$_POST['jnquery'];
$con = mysql_connect("localhost","user","passwd");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("icc_db", $con);
$result ="SELECT * FROM saprunbook WHERE Job_Name like '%$jnquery%'";
echo "<table align='center' cellspacing='0' cellpadding='0'>
<tr>
<th>Job Name</th>
<th>Job Title</th>
<th>Contact</th>
<th>Phone</th>
<th>Schedule</th>
<th>Est</th>
<th>Frequency</th>
<th>Action</th>
</tr>";
while($row = mysql_fetch_object($result))
{
echo "<tr>";
echo "<td>" . $row['Job_Name'] . "</td>";
echo "<td>" . $row['Job_Title'] . "</td>";
echo "<td>" . $row['Contact'] . "</td>";
echo "<td>" . $row['Phone'] . "</td>";
echo "<td>" . $row['Schedule'] . "</td>";
echo "<td>" . $row['Est'] . "</td>";
echo "<td>" . $row['Freq'] . "</td>";
echo "<td>" . $row['Operations'] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_close($con);
?>
</html>


Als Resultat bekomme ich
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in /var/www/saprunbookquery.php on line 30

Kann mir jemand sagen was ich falsch mache?

Vielen Dank für Eure Hilfe

10 Antworten

0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
In der Doku (die du zu jeder Funktion befragen kannst) ist ein hervorragendes Beispiel (#1). Du musst deine Abfrage erstmal ausführen mittels mysql_query().
0 Punkte
Beantwortet von boma Einsteiger_in (27 Punkte)
Danke, ich werde es mir gleich anschauen.
0 Punkte
Beantwortet von boma Einsteiger_in (27 Punkte)
son_quatsch

danke für deinen tipp, hat das problem geschmälert...

jedoch glaube ich das hiermit Zeile 2 etwas nicht stimmt! Vorallem den Part nach like...

1 $jnquery=$_POST['jnquery'];
2 $result = mysql_query("SELECT * FROM saprunbook WHERE Job_Name like '%$jnquery%'");

$_POST ist momentan noch ein Buch mit sieben Siegel für mich. Aber defitiv das nächste Thema zum durchackern.

Danke nochmals
0 Punkte
Beantwortet von boma Einsteiger_in (27 Punkte)
ok jetzt bin ich noch mehr verwirrt oder ganz nahe dran

<html>
2 <title>ICC EMEA Runbook for SAP</title>
3 <link href="styles.css" rel="stylesheet" type="text/css" />
4 <?php
5 echo "
6 <form method='post' action='saprunbookquery.php'>
7 <input name='jnquery' type='text' size='50' maxlength='50'>
8 <input type='submit' class='button1' value='Go!' name='button1' />
9 </form>
10 ";
11 $jnquery=$_POST['jnquery'];
12 $con = mysql_connect("localhost","root","utopia");
13 if (!$con)
14 {
15 die('Could not connect: ' . mysql_error());
16 }
17 mysql_select_db("icc_db", $con);
18 // $result ="SELECT * FROM saprunbook WHERE Job_Name like '%$jnquery%'";
19 $result = mysql_query("SELECT * FROM saprunbook WHERE Job_Name LIKE '$_POST[jnquery]'");
20 echo "<table align='center' cellspacing='0' cellpadding='0'>
21 <tr>
22 <th>Job Name</th>
23 <th>Job Title</th>
24 <th>Contact</th>
25 <th>Phone</th>
26 <th>Schedule</th>
27 <th>Est</th>
28 <th>Frequency</th>
29 <th>Action</th>
30 </tr>";
31 while($row = mysql_fetch_object($result))
32 {
33 echo "<tr>";
34 echo "<td>" . $row['Job_Name'] . "</td>";
35 echo "<td>" . $row['Job_Title'] . "</td>";
36 echo "<td>" . $row['Contact'] . "</td>";
37 echo "<td>" . $row['Phone'] . "</td>";
38 echo "<td>" . $row['Schedule'] . "</td>";
39 echo "<td>" . $row['Est'] . "</td>";
40 echo "<td>" . $row['Freq'] . "</td>";
41 echo "<td>" . $row['Operations'] . "</td>";
42 echo "</tr>";
43 }
44 echo "</table>";
45 mysql_close($con);
46 ?>
47 </html>


jetzt krieg ich zwar keine Fehlermeldung, aber auch keinen Output von der Abfrage... ich glaub jetzt bin ich in einer Sackgasse gelandet.

Danke für jede Hilfe.
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo boma,

Dein Code ist unsicher! Mit SQL-Injection unterlaufe ich deine fachliche Intention sofort. Ich
hoffe du bringst so was nicht ins www.

Gruß Ralf
0 Punkte
Beantwortet von boma Einsteiger_in (27 Punkte)
Hallo Ralf

nein keine Angst, das bleibt im Firmen Intranet und ist eigentlich nur für unsere Abteilung bestimmt.

Dennoch wäre ich um Rat dankbar, wie man den Code sicherer machen kann.

Gruss
boma
0 Punkte
Beantwortet von boma Einsteiger_in (27 Punkte)
primär wäre ich an der Lösung interessiert wie man die Abfrage zum laufen bekommt.

sekundär wäre ein sicherer Code erstrebenswert aber ich mache gerade meine ersten schritte mit php.
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
boma, zunächst einmal: wenn du wieder Code postest, dann benutz die [ CODE ]...[ /CODE ]-Formatierung - ansonsten werden Leerzeichen geschluckt.

Dann: verwendest du als Tabellenspalten Namen in Groß- und Kleinschreibung - sind diese wirklich exakt so definiert? Wenn du später auf $row zugreifst, dann arbeitest du mit einem Feld. Ein Feld hat Elemente. Auf diese Elemente wird per Index zugegriffen - und ein Index 'eins' ist ein anderer als Index 'EiNs'. Sind deine Tabellenspalten also gar nicht exakt so definiert, sondern z.B. als 'job_name' oder 'JOB_NAME', dann greifst du auf ein nicht vorhandenes Feldelement zu. Dementsprechend hab ich nun error_reporting( E_ALL ); - damit sollte es jeweils eine Fehlermeldung geben, wenn wir auf nicht existierende Feldelemente zugreifen wollen (und ansonsten auch Unfug machen).

Ein Beispiel zu einer Vermeidung von SQL-Injection hab ich auch implementiert.

Der Rest ist kommentiert.

<html><head>
<title>ICC EMEA Runbook for SAP</title>
<link href="styles.css" rel="stylesheet" type="text/css" />
</head><body>
<form method="post" action="saprunbookquery.php">
<input name="jnquery" type="text" size="50" maxlength="50">
<input type="submit" class="button1" value="Go!" name="button1" />
</form><?php

// Zeige alles, was wir unter PHP falsch machen
error_reporting( E_ALL );

// Mit DBMS verbinden; bei Fehlschlag Meldung
$con= mysql_connect( 'localhost', 'root', 'utopia' ) or die( 'Keine Verbindung: '. mysql_error() );

// DB auswählen; bei Fehlschlag Meldung
mysql_select_db( 'icc_db', $con ) or die( 'Konnte DB nicht wählen: '. mysql_error() );

// Eine SQL-Injection ist z.B., wenn folgender Text übergeben werden würde:
// '; DROP DATABASE; SELECT 1 FROM DUAL WHERE ''= '
// Würden wir das einfach an unsere SQL-Abfrage anhängen, würden drei syntaktisch korrekte
// Komanndos ausgeführt werden, wovon eins tödlich wäre. Deshalb ersetzen wir in der
// Übergabe alle ' mit einem '', was unter MySQL dann kein Textbegrenzer, sondern ein
// Hochkomma im Text selbst darstellt.
$where= str_replace( '\'', '\'\'', $_POST['jnquery'] );

// Wurde überhaupt etwas übergeben? Dann komplett zur WHERE-Bedingung ausbauen...
if( strlen( $where )> 0 ) $where= ' WHERE Job_Name LIKE \''. $where. '\'';

// ...ansonsten würden wir den kompletten Tabelleninhalt ausgeben
$sql= 'SELECT * FROM saprunbook'. $where;

// Abfrage ausführen; bei Fehlschlag Meldung samt SQL-Kommando
$result= mysql_query( $sql ) or die( 'Abfragefehler für >>'. $sql. '<<: '. mysql_error() );

// Tabellenkopf ausgeben
echo '
<table align="center" cellspacing="0" cellpadding="0"><tr>
<th>Job Name</th>
<th>Job Title</th>
<th>Contact</th>
<th>Phone</th>
<th>Schedule</th>
<th>Est</th>
<th>Frequency</th>
<th>Action</th>
</tr>';

// Jeden Datensatz als Tabellenzeile ausgeben.
// VORSICHT! Bei den Spaltennamen wird zwischen Groß- und Kleinschreibung
// unterschieden - existieren diese also nicht wirklich exakt in dieser Schreibweise
// in der Tabelle, so werden wir im folgenden immer auf leere Feldelemente zugreifen!
while( $row= mysql_fetch_object( $result ) ) echo '<tr>
<td>'. $row['Job_Name']. '</td>
<td>'. $row['Job_Title']. '</td>
<td>'. $row['Contact']. '</td>
<td>'. $row['Phone']. '</td>
<td>'. $row['Schedule']. '</td>
<td>'. $row['Est']. '</td>
<td>'. $row['Freq']. '</td>
<td>'. $row['Operations']. '</td>
</tr>';

// Tabelle schließen
echo "</table>";

// Abfrageergebnis freigeben
mysql_free_result( $result );

// DBMS-Verbindung freigeben
mysql_close( $con );

?></body></html>
0 Punkte
Beantwortet von boma Einsteiger_in (27 Punkte)
Hallo son quatsch :o)

vielen Dank für die Zeit die Du aufgewendet hast für die Aufschlüsselung / Kommentierung dieses Codes. Ich werde wohl noch ein bisschen studieren müssen, den irgendwie scheint es noch nicht ganz so zu funktionieren. Die Schreibweise der Spalten entspricht denen vom Code...

Eine Frage am Rande, was für ein Buch kannst Du mir empfehlen? Kann auch in English sein.

Grüsse
0 Punkte
Beantwortet von son_quatsch Experte (5.3k Punkte)
vielen Dank für die Zeit die Du aufgewendet hast
Es ist eins der ersten und häufigsten Problemszenarien aller PHP-Anfänger - daher war es nicht weiter schwierig :-)

irgendwie scheint es noch nicht ganz so zu funktionieren
Jedes "irgendwie" in einer Beschreibung fehl am Platze - was genau funktioniert nicht? Wenn es keine Fehlermeldung gibt, dann klappt technisch alles. Wenn du keine Daten bekommst, dann überprüf das erstellte SQL. Werden PHP-Warnungen ausgegeben? Also: wie weit funktioniert es und ab wo kannst du woran erkennen, dass es nicht deinen Erwartungen entspricht?

Eine Frage am Rande, was für ein Buch kannst Du mir empfehlen? Kann auch in English sein.
Hab nie Bücher fürs Programmieren verwendet. www.php.net ist nicht nur die offizielle Seite, sondern hat auch eine sehr gute Dokumentation zu jeder Funktion und jedem sonstigen Bereich der Sprache. Und viele Leute haben dann zusätzliche Beispiele dort veröffentlicht, sodass man auf viele Anwendungsmöglichkeiten hingewiesen wird. Die Doku gibt es sogar mehrsprachig - mein Link neulich war die Doku auf Deutsch. Die ganze Doku gibt's auch als Download zum offline betrachten.
...