aruba1
Goto Top

kleine PHP Abfrage

Hallo,

kann mir jemand helfen,
Ich bin in PHP eine absolute Niete.

Ich habe eine Tabelle (wp_plz) in meiner MYSQL DB angelegt
Diese Tabelle enthät 3 Felder mit den Namen:

Name, Ort, PLZ

Jetzt brauche ich eine PHP Seite mit einem Eingabefeld wo man die PLZ eintragen kann
und einen Button um eine Abfrage auslösen.

Nach dem auslösen des Buttons soll dann die Tabelle nach der eingegeben PLZ durchsucht werden
und als Ergebnis soll dann der Name und der Ort auf der Seite erscheinen.

Ich danke jetzt schon für die Hilfe.

Content-ID: 125870

Url: https://administrator.de/contentid/125870

Ausgedruckt am: 25.11.2024 um 17:11 Uhr

maretz
maretz 26.09.2009 um 14:10:48 Uhr
Goto Top
Was hast du damit vor? Es gibt nämlich auch die GeoDatabase - falls du immer nur einen Ort zu ner PLZ finden willst würde ich dir empfehlen dir das genauer anzugucken... Dann brauchst du nicht alle möglichen PLZ-Daten selbst verwalten...
aruba1
aruba1 26.09.2009 um 14:18:51 Uhr
Goto Top
Hallo,

mit Geodaten habe ich nix am Hut. Ich brauche nur zu einer PLZ den entsprechenden Ansprechpartner. In dem fall einen Aussendienstmitarbeiter.
Die Postleitzahlen kommen aus einem Programm das ich selbst verwalte. Da ändert sich immer nur der Name des Aussendienstmitarbeiters.

Aber trotzdem danke für die Hilfe.
Cubic83
Cubic83 26.09.2009 um 14:28:04 Uhr
Goto Top
Hmm.

Wo liegt das Problem?

Die Anfrageseite mit dem Formular:

<form method="post" name="myForm" action="auswertung.php">  
<input type="text" name="PLZ_FELD_DER_ANFRAGESEITE">  
<input type="submit" value="Suchen">  
</form>

Und bei der Auswertung:

<?

$SQL = "SELECT * FROM 'wp_plz' WHERE PLZ='".$_POST['PLZ_DER_ANFRAGESEITE']."'";  
$result = mysql_query($SQL);

if (mysql_num_rows($result) > 0)
{
   echo "Name: " . mysql_result($result, 0, 'Name'). "; Ort: " . mysql_query($result, 0, 'Ort');  
}
else 
{
   echo 'Sorry, keine Einträge gefunden!';  
}

?>

Meinst du etwa das?

Nachtrag: Bin mir grad nicht sicher ob pro PLZ in Deutschland immer ein eindeutiges Name, Ort Resultat erscheint - Vielleicht weiss das ja einer ---
filippg
filippg 26.09.2009 um 16:11:27 Uhr
Goto Top
Hallo,

$SQL = "SELECT * FROM 'wp_plz' WHERE
PLZ='".$_POST['PLZ_DER_ANFRAGESEITE']."'";
$result = mysql_query($SQL);
Konfuzius sagt: gebe niemals eine Nutzereingabe direkt an eine DB-Abfrage weiter, sonst ist SQL-Injection vorprogrammiert (im wahrsten Sinne des Wortes face-wink ). Wenn ein Nutzer da "12345; SELECT username AS Ort, pwd AS Name FROM MeineGeheimstenPasswoerter" eingibt kann es schon passiert sein...

Nachtrag: Bin mir grad nicht sicher ob pro PLZ in Deutschland immer
ein eindeutiges Name, Ort Resultat erscheint - Vielleicht weiss das ja
einer ---
Das kommt völlig darauf an, was du in deiner Tabelle für Daten hast face-wink und natürlich wie du "Ort" definierst. Aber definitiv hat nicht alles, was ein eigenes Ortsschild hat eine eigene PLZ.

Gruß

Filipp
Cubic83
Cubic83 26.09.2009 um 17:28:31 Uhr
Goto Top
Und Konfuzius war schlieslich ein schlaues Bürchen ;)

Wie wär das:

$SQL =  "SELECT * FROM 'wp_plz' WHERE PLZ='".preg_replace('#[^0-9]#', "", $_POST['PLZ_DER_ANFRAGESEITE'])."'";  

oder sogar noch:

if (strlen($_POST['PLZ_DER_ANFRAGESEITE']) > 6) $_POST['PLZ_DER_ANFRAGESEITE'] = '000000';  
$SQL =  "SELECT * FROM 'wp_plz' WHERE PLZ='".preg_replace('#[^0-9]#', "", $_POST['PLZ_DER_ANFRAGESEITE'])."'";  

mfG
filippg
filippg 26.09.2009 um 18:22:04 Uhr
Goto Top
Hallo,

die zweite Variante ist die eindeutig bessere.
Mein Injection-Beispiel lässt sich nämlich noch abändern, ewta nach
"12345 UNION SELECT username AS Ort, pwd AS Name FROM MeineGeheimstenPasswoerter" - gleicher Effekt, kein Semikolon mehr (okay, aber ein ",").

Gruß

Filipp
aruba1
aruba1 26.09.2009 um 19:56:34 Uhr
Goto Top
Hallo,

habe ich probiert Bekomme aber folgende Fehlermeldung:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/xxxxxx/auswertung.php on line 26
Sorry, keine Einträge gefunden!

Was mache ich hier falsch???


Vielen Dank für eure tolle Hilfe

PS:

So sieht mein PHP Sript aus:


<?
define ( 'MYSQL_HOST', 'localhost' );
define ( 'MYSQL_BENUTZER', 'xxxxxxx' );
define ( 'MYSQL_KENNWORT', 'xxxxxxx' );
define ( 'MYSQL_DATENBANK', 'xxxxxxx' );


$db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
if ( ! $db_link ){
die('keine Verbindung zur Zeit möglich - später probieren ');
}

$db_sel = mysql_select_db( MYSQL_DATENBANK )
or die("Auswahl der Datenbank fehlgeschlagen");

// SQL-Befehl für den Zugriff


$SQL = "SELECT * FROM 'wp_plz' WHERE PLZ='".$_POST['PLZ_DER_ANFRAGESEITE']."'";
$result = mysql_query($SQL);

if (mysql_num_rows($result) > 0)
{
echo "Name: " . mysql_result($result, 0, 'Name'). "; Ort: " . mysql_query($result, 0, 'Ort');
}
else
{
echo 'Sorry, keine Einträge gefunden!';
}
Cubic83
Cubic83 26.09.2009 um 20:05:01 Uhr
Goto Top
Jetzt ist deine Aufgabe den Fehler zu finden. Das System zu debuggen.
Als erstes kannst du ein

echo $SQL;

durchführen um zu sehen wie die Query richtig aussieht. Diese Query kannst du dann im PHPMyAdmin direkt an die Datenbank schicken um zu sehen was sie bewirkt.

Auch kannst du dir den Fehler anzeigen lassen den die Abfrage generiert:

$SQL = "SELECT * FROM 'wp_plz' WHERE PLZ='".$_POST['PLZ_DER_ANFRAGESEITE']."'";  
$result = mysql_query($SQL);

echo mysql_error();

mfG

Edit: Pack deinen Code in einen Codeblock, das sieht besser und leserlicher aus. (hier im Forum: Schreib von den code "< code >" und danach "< /code >" - ohne Anführungszeichen und ohne Leerzeichen). Dann erscheint der Quelltext wie in meinem Beitrag.

Edit2: Ich bin nicht sicher ob ich richtig lese aber die Query muss lauten:

WHERE PLZ='".$___.'" Also vorne Apostroph Gänschefüschen (oder wie die Dinger auf Deutsch heissen. Die Dinger halt: ") und hinten muss es " und dann Apostroph sein.
aruba1
aruba1 26.09.2009 um 20:38:11 Uhr
Goto Top
Ich habe jetzt mal den SQL ausgeben lassen

Das Erbegnis:

SELECT * FROM 'wp_plz' WHERE PLZ=''

Irgendwie fehlt da was.
???
dog
dog 26.09.2009 um 20:40:25 Uhr
Goto Top
Edit2: Ich bin nicht sicher ob ich richtig lese aber die Query muss lauten:

Bevor wir jetzt lustiges Raten um SQL-Injections machen:

<?php

	define ( 'MYSQL_HOST', 'localhost' );  
	define ( 'MYSQL_BENUTZER', 'xxxxxxx' );  
	define ( 'MYSQL_KENNWORT', 'xxxxxxx' );  
	define ( 'MYSQL_DATENBANK', 'xxxxxxx' );  

	// SQL-Befehl für den Zugriff

	if(isset($_POST['PLZ'])) {  
		
		$plz = @intval($_POST['PLZ']);  
		
		if($plz < 1000 || $plz > 9999)
			die('Ungültige PLZ angegeben');  
			
		$db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
		if ( ! $db_link ){
			die('keine Verbindung zur Zeit möglich - später probieren ');  
		}

		mysql_select_db( MYSQL_DATENBANK )
			or die("Auswahl der Datenbank fehlgeschlagen");	  
		
		$sql    = sprintf("SELECT * FROM `wp_plz` WHERE plz = %05u",$plz);  
		$query  = mysql_query($sql);
		
		if(mysql_num_rows($query) == 1) {
			$result = mysql_fetch_row($query);
			echo "Name: " . $result['Name']. "; Ort: " . $result['Ort'];  
		} else {
			echo 'Sorry, keine Einträge gefunden!';  
		}
		
	}

?>

Übrigens ist eine Suche nach Postleitzahlen nicht immer ideal.
Jemand der im 97xxx-Gebiet wohnt hat u.U. einen näheren Ansprechpartner im 36xxx-Gebiet...

Grüße

Max
Cubic83
Cubic83 26.09.2009 um 20:46:53 Uhr
Goto Top
Ersetz mal PLZ_DER_ANFRAGSEITE durch irgendwas kurzes, wie z.b ptplz oder so. Ich glaube die _ werden nicht richtig übertragen.
Cubic83
Cubic83 26.09.2009 um 20:48:48 Uhr
Goto Top
Kannst du noch kurz sagen was das %05u genau bewirkt, bzw. wo man das nachlesen kann? Habe diese Schreibweise noch nie gesehen. Würde mich interessieren.
dog
dog 26.09.2009 um 21:04:59 Uhr
Goto Top
Steht alles erklärt:

http://de2.php.net/sprintf

% - Beginn der Steuersequenz
0 - Fülle Platz mit 0en auf
5 - Benutze mind. 5 Stellen
u - Formatiere die Zahl als positive Ganzzahl.

Grüße

Max
aruba1
aruba1 27.09.2009 um 13:12:42 Uhr
Goto Top
Hallo nochmal,

also irgendwie bin ich am verzweifeln. Es klappt einfach nicht.

Villeicht hoch mal meine Vorgehensweise. Vielleicht mache ich ja etwas grundlegendes falsch.

Ich habe eine Tabelle mit dem PHPMYADMIN angelegt.
Tabellenname: wp_plz
Felder:
plz
name
ort

In diese Tabelle habe ich meine Daten importiert

Beispiel:
plz name ort
55437 Maier Appenheim

Jetzt habe ich eine Datei stellt mit dem Namen myform.php. Darin steht:

<form method="post" name="myForm" action="auswertung.php">   
<input type="text" name="PLZ_FELD_DER_ANFRAGESEITE">  
<input type="submit" value="Suchen">  
</form> 

Dann habe eine Dateierstellt mit dem Namen auswertung.php. Darin steht:

<?
define ( 'MYSQL_HOST', 'localhost' );  
define ( 'MYSQL_BENUTZER', 'xxxx' );  
define ( 'MYSQL_KENNWORT', 'xxxx' );  
define ( 'MYSQL_DATENBANK', 'xxxx' );  

	// SQL-Befehl für den Zugriff
$SQL = "SELECT * FROM 'wp_plz' WHERE PLZ='".$_POST['PLZ_DER_ANFRAGESEITE']."'";  
$result = mysql_query($SQL);

if (mysql_num_rows($result) > 0)
{
   echo "Name: " . mysql_result($result, 0, 'Name'). "; Ort: " . mysql_query($result, 0, 'Ort');  
}
else 
{
   echo 'Sorry, keine Einträge gefunden!';  
}

?>

Was zum KUCKUCK mache ich denn hier faslch????

Danke
Cubic83
Cubic83 27.09.2009 um 13:21:51 Uhr
Goto Top
Hello again,

Erstens lese ich noch immer PLZ_DER_ANFRAGESEITE. Ersetz das mal durch was kurzes wie ptPLZ. In den beiden Dateien.

Zweitens: Wenn das der gesamte Inhalt der auswertung.php ist fehlt der Teil mit dem Verbindungsaufbau :

<?php

	define ( 'MYSQL_HOST', 'localhost' );  
	define ( 'MYSQL_BENUTZER', 'xxxxxxx' );  
	define ( 'MYSQL_KENNWORT', 'xxxxxxx' );  
	define ( 'MYSQL_DATENBANK', 'xxxxxxx' );  

	$db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
	if ( ! $db_link ) {
		die('keine Verbindung zur Zeit möglich - später probieren ');  
	}

	mysql_select_db( MYSQL_DATENBANK )
		or die("Auswahl der Datenbank fehlgeschlagen");	  
	
                     ...........
?>


mfG
aruba1
aruba1 27.09.2009 um 13:45:03 Uhr
Goto Top
Hallo,

ich hatte das mit dem PLZ_DER_ANFRAGESEITE schon geändert. Hatte aber auch nix gebrcht. Es ist aber jetzt aktuell ptPLZ

Leider kommt jetzt immer: Sorry, keine Einträge gefunden!

Habe den SQL mal ausgegeben. Er lautet: SELECT * FROM 'wp_plz' WHERE PLZ='55218'

Wenn ich diesen SQL im PHPMYADMIN laufen lasse kommt auch ein Ergebnis.

Ich denke das wir der Lösung dank eurer Hilfe ganz nahe sind.

Viellecht kann sich ja jemand per Teamviewer bei mir einwählen. Ein Bild sagt manchmal mehr wie 1000 Worte.
Cubic83
Cubic83 27.09.2009 um 13:54:38 Uhr
Goto Top
Und die fetch_row Variante von Dog? Nimm doch mal Dog's Code und kopiere ihn 1zu1. Das müsste hinhauen.


Teamviewer fällt bei mir aus - mache ich grundsätzlich nicht.

mfG
aruba1
aruba1 27.09.2009 um 14:04:18 Uhr
Goto Top
Habe ich gemacht. Da kommt garnix als Ergebnis. Einfach nur eine leere Seite. Ich glaub ich geb auf.
Cubic83
Cubic83 27.09.2009 um 14:07:53 Uhr
Goto Top
Du brauchst nicht aufzugeben. Poste doch mal beide Dateien genau so wie sie jetzt sind. Poste zusätzlich noch die Tabellenstruktur und den Inhalt so wie er in PHPmyAdmin angegeben ist. Das kriegen wir schon hin.

mfG
aruba1
aruba1 27.09.2009 um 14:22:25 Uhr
Goto Top
Danke für die Ausdauer:


Datei myform.php

<form method="post" name="myForm" action="auswertung.php">   
<input type="text" name="ptPLZ">  
<input type="submit" value="Suchen">  
</form> 


Datei Auswertung.php
<?php
/*Configure your database connection*/
$dbhost = 'localhost';  
$dbuser = 'xxxxx';  
$dbpass = 'xxxxx';  

/*Connect to the database.*/
$conn = mysql_connect ($dbhost, $dbuser, $dbpass)
		or die
		('There was an error connecting to the database.');  
		
/*Select your WordPress database.*/
$dbname = 'xxxxx';  
mysql_select_db ($dbname);

$SQL = "SELECT * FROM 'wp_plz' WHERE PLZ='".$_POST['ptPLZ']."'";   
$result = mysql_query($SQL);

if (mysql_num_rows($result) > 0)
{
   echo "Name: " . mysql_result($result, 0, 'Name'). "; Ort: " . mysql_query($result, 0, 'Ort');  
}
else 
{
   echo 'Sorry, keine Einträge gefunden!';  
}	
?>



Tabellenstruktur im PHPMYADMIN

Feld Typ Kollation Attribute Null
plz varchar (5) utf8_general_ci Nein
name varchar (40) utf8_general_ci Nein
Ort varchar (50) utf8_general_ci Nein


Inhalt der Tabelle z. B.:

plz name Ort
55218 Karl Napp Ingelheim
und noch 1000 andere Datensätze


SQL Befelhl im P`HPMYADMIN den ich abschicke

SELECT * FROM `wp_plz` WHERE `plz`=55218

Ergebnis:
55218 Karl Napp Ingelheim


Aber im SQL-Befehl im PHPMYADMIN steht dann oben:

SELECT *
FROM `wp_plz`
WHERE `plz` =55218
LIMIT 0 , 30

Ich hoffe ich habe nix vergessen.
Cubic83
Cubic83 27.09.2009 um 14:43:01 Uhr
Goto Top
Ok,

dann folgendes:

1)
$dbname = 'xxxxx';   
mysql_select_db ($dbname); 

sollte am besten lauten:

mysql_select_db('xxxxxx');  

Man sollte es sich abgewöhnen für alles Variablen zu benutzen. Variablen verbrauchen speicher. PHP verwaltet den Speicher zwar extrem effizient, aber trotzdem ist es eine schlechte Angewohnheit. Das hat aber nichts mit dem Fehler zu tun!

2. Code

Versuch mal genau diesen Code:


<?php

/*Connect to the database.*/

$conn = mysql_connect ('localhost', 'xxxxxx', 'xxxxxx') or die ('There was an error connecting to the database.');  
		
mysql_select_db ('xxxxxx');  

$SQL = "SELECT * FROM 'wp_plz' WHERE plz='".$_POST['ptPLZ']."'";   

$result = mysql_query($SQL);

while ($row = mysql_fetch_row($result)) {
    echo "<br>".$row['name'].' - '.$row['Ort'].' - '.$row['plz'];  
}

mysql_free_result($result);
mysql_close($conn);

?>

Kopier den Code indem du auf den Link "In den Arbeitspeicher kopieren" klickst (hier im Forum über dem Code-Block) und dann in die Datei kopierst. Kopier es bitte genau so, da auch manches an der Gross/Kleinschreibung geändert wurde.

mfG
aruba1
aruba1 27.09.2009 um 14:59:57 Uhr
Goto Top
Hallo,

habe den Code kopiert und nur noch den DB Namen, PW eingegen.

hier der Link zu myform.php
http://aruba1.ar.funpic.de/myform.php

Gib die PLZ 55218 ein. Die gibt es

mfg

PS:

Hier habe ich nur eine Test gemacht ob die DB Konfig überstimmt

http://aruba1.ar.funpic.de/new.php
Sieht denke ich gut aus. Ich habe nur abgefragt wieviel Datensätze die Tabelle wp_plz enthält.
Cubic83
Cubic83 27.09.2009 um 15:08:57 Uhr
Goto Top
Hast du einen FTP am laufen? Dann kannst du mir vielleicht die Zugangsdaten (per PN!) geben.

Ansonsten bekommst du ja die Meldung

"Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/aruba1/auswertung.php on line 13"

Das heisst genau dass die Variable $result keinen gültigen Zeiger auf die Resultate hat. Oder anders gesagt: Irgendwas schmeckt ihm nicht an der Zeile $result= mysql_query($SQL). Was ihm nicht schmeckt sagt er dir auch wenn du die Zeile

echo "<br>".mysql_error($conn);  

hinter die "$result"-Zeile anfügst.

mfG
aruba1
aruba1 27.09.2009 um 15:28:05 Uhr
Goto Top
Hallo,

ich habe die Zeile eingefügt

Ergebnis:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''wp_plz' WHERE plz='55218'' at line 1

Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/aruba1/auswertung.php on line 14

Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/aruba1/auswertung.php on line 18

Kann das sein das hier ein " oder ' zuviel oder zuwenig ist?

Ich habe immer noch den Code den du mir gerade gepostet hast.

mfg
Cubic83
Cubic83 27.09.2009 um 15:41:03 Uhr
Goto Top
Vom Code her müsste es passen. Wenn du glaubst dass der SQL Code das Problem ist, kannst du das testen indem du ein

echo "<br>".$SQL;  

einfügst. Entweder du siehst den Fehler sofort oder aber du kannst die Query in phpmyadmin eingeben. Es kann auch schon helfen wenn du die query mal folgendermassen abänderst:

$SQL = "SELECT * FROM 'wp_plz' WHERE plz='55218'";    

Wichtig: Ändere bitte sonst nichts weil sonst sprechen wir ständig von verschiedenen Versionen und drehen uns dauernd im Kreis.

mfG
aruba1
aruba1 27.09.2009 um 16:00:30 Uhr
Goto Top
Hallo,

habe folgendes gemacht:

1. echo "<br>".$SQL; eingefügt und den SQL in PHPMYADMIN eingesetzt.
2 Ergebnis davon war ein Fehler. Ungültige Schreibweise.
3. Den SQL Befehl in PHPMYADMIN von Hand eingegeben.
Ergebis geht.

SQL der PHP Seite in PHPMYADMIN eingegeben (geht nicht)
SELECT * FROM 'wp_plz' WHERE plz='55218'


SQL von Hand in PHPMYADMIN (geht)
SELECT * FROM `wp_plz` WHERE 1=55218

Man beachte die ' vor und hinter der 55218
und
die ` vor und hinter wp_plz

liegt hier der Fehler?
Cubic83
Cubic83 27.09.2009 um 16:04:03 Uhr
Goto Top
Dann ändere das doch mal um:

$SQL = "SELECT * FROM `wp_plz` WHERE 1=55218";  

Vielleicht hat sich die Schreibweise mit den Versionen geändert. Ich arbeite seit einem Jahr nicht mehr mit mySQL.

mfG
aruba1
aruba1 27.09.2009 um 16:21:14 Uhr
Goto Top
Hallo,

erstes Erfolgserlebis:

Das hat geklappt

http://aruba1.ar.funpic.de/myform.php
$SQL = "SELECT * FROM `wp_plz` WHERE plz=55218";  



Wie kriege ich das jetzt noch hin das er die PLZ aus der myform.php übernimt???

DDDDDDDDDDDDAAAAAAAAAANNNNNNNNNNNNNKKKKKKKKKKKKKKKKKKKEEEEEEEEEEEE
Cubic83
Cubic83 27.09.2009 um 16:28:29 Uhr
Goto Top
Also wenn ihm die Apostroph nicht schmecken dann:

$SQL = "SELECT * FROM `wp_plz` WHERE 1=".$_REQUEST['ptPLZ'];  

oder

$SQL = "SELECT * FROM `wp_plz` WHERE 1=".$_POST['ptPLZ'];  
aruba1
aruba1 27.09.2009 um 16:43:35 Uhr
Goto Top
Hallo,


dads hat geklappt.

$SQL = "SELECT * FROM `wp_plz` WHERE plz=".$_REQUEST['ptPLZ'];   

Vielen Dank an Cubic83 und die anderen

Schönes Wochenende noch