../test_tr.php?init=12 ||||||||| ../test_tr.php?init=ws

mkoeni1

Erfahrenes Mitglied
Hallo PHP-Gemeinde,


ich habe eine PHP Datei mit einer MySQL Datenbank im Hintergrund. Auf der DB sind Spieler gespeichert und an die Daten wmöchte ich gerne per PHP-Datei hinkommen, bzw. auslesen.

Darum gebe ich meiner SELECT-Anweisung fogenden Parameter über die URL für die WHERE-Bedingung (siehe Code) mit.

PHP:
test_tr.php?init=12

Die Browser-Ausgabe der dazugehörigen Zeile aus der DB läuft wunderbar. Ich vermute mal, der unten genannte Fehler hat was mit der (Primary-Key-Definition) in der Datenbank zu tun. id ist dort als PK definiert.

der Code mit dem es funktioniert:
PHP:
...
//Verbindung aufbauen
     mysql_connect("localhost","root","")
        or die("Keine Verbindung");

    //Datenbank auswählen
    mysql_select_db(test);
    
    //GET-Wert mit der Hand aus der URL geholt
     $initialize = $_GET['init'];
    
    //Anfrage an die Tabelle stellen  
    $result  =  mysql_query("SELECT * FROM spieler WHERE id = $initialize;");
    $row=mysql_fetch_array($result);
    $name=$row["Name"];
...
soweit so gut alles Bestens.

Will ich die WHERE Bedingung jetzt aber wie folgt setzen (initial = $initialize) , wie in folgendem Script zu sehen ...

der Code mit dem es nicht funktioniert: :confused:
PHP:
...
3 //Verbindung aufbauen
4    mysql_connect("localhost","root","")
5        or die("Keine Verbindung");

7    //Datenbank auswählen
8    mysql_select_db(test);
    
10    //GET-Wert mit der Hand aus der URL geholt
11     $initialize = $_GET['init'];
    
13    //Anfrage an die Tabelle stellen  
14    $result  =  mysql_query("SELECT * FROM spieler WHERE initial = $initialize;");
15    $row=mysql_fetch_array($result);
16    $name=$row["Name"];
...
und dem dazu folgenden Aufruf der URL:
PHP:
test_tr.php?init=ws

bekomme ich folgenden Fehler:

PHP:
Warning:  mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ..\test_tr.php on line 15

Ich habe folgende DB Struktur angelegt:
Code:
CREATE TABLE `spieler` (
  `id` int(3) NOT NULL,
  `initial` varchar(2) collate latin1_general_ci NOT NULL,
  `Name` varchar(255) collate latin1_general_ci NOT NULL,
  `Spitzname` varchar(255) collate latin1_general_ci NOT NULL,
  `Geburtstag` varchar(255) collate latin1_general_ci NOT NULL,
  `Vorbild` varchar(255) collate latin1_general_ci NOT NULL,
  `Lieblingsessen` varchar(255) collate latin1_general_ci NOT NULL,
  `Lieblingsmusik` varchar(255) collate latin1_general_ci NOT NULL,
  `Lieblingsverein` varchar(255) collate latin1_general_ci NOT NULL,
  `EMail` varchar(255) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci COMMENT='zu testzwecken';

Kann mir da jmd. einen Tipp geben, wie ich das trotzdem mit initial realisieren kann ? Denn über die id habe ich später mal keine so eindeutige Zuordnug der Spieler wie mit initial. Ich kann mir später mal zu einer Nummer 12 keinen Spieler merken. Mit dem String "ws" für initial bin ich da schon wesentlich besser dran ;-)
Das ich jetzt kein root-PW habe lassen wir mal außer Acht :-)

Vielen Dank und Viele Grüße
Matze
 
Du musst die Benutzereingaben auch validieren, sonder kann es zu bösen Überraschungen kommen.

Daher probier mal Folgendes:
PHP:
$_GET['init'] = ( abs(intval($_GET['init'])) == $_GET['init'] )
	? abs(intval($_GET['init']))
	: null;

if( !empty($_GET['init']) ) {
	$query = '
		SELECT
		        *
		  FROM
		        `spieler`
		  WHERE
		        `initial` = '.$_GET['init'].'
		';
	$result = mysql_query($query)
		or die(mysql_error());
	$row = mysql_fetch_array($result);
	…
}
 
Hallo,

grundsätzlich sollte man mal keine Daten, die aus externen Quellen kommen (vor allem Benutzereingaben) ungeprüft an die Datenbank weiterleiten. Es besteht immer die Gefahr einer SQL-Injektion.

Zum Thema: versuch es mal so:

PHP:
$result  =  mysql_query("SELECT * FROM `spieler` WHERE `initial` = '".mysql_real_escape_string($initialize)."'");
if (!$result) {
    die(mysql_error());
}
Damit wird bei einem Fehler gegebenenfalls das Skript abgebrochen und eine aussagekräftige MySQL-Fehlermeldung ausgegeben.

Grüße,
Matthias
 
Hallo zusammen,

die erhaltenen Antworten sind sehr nützlich. Ich habe diese umgesetzt und jetzt funktionierts ;-)

Dem Thema -> SQL-Injektion gilt meine weitere Konzentration. Danke für den Hinweis !!

Nochmals Vielen Dank
Matze
 
Zurück