PHP in SQL-Abfrage

Jonas123

Ensign
Registriert
Mai 2008
Beiträge
209
Hi,
ich übernehme folgende Variablen aus einem Formular:
Code:
a, b, c, d
Dann soll er aus einer SQL-Datenbank abfragen, obs ne Zeile gibt, wo diese 4 Variablen übereinstimmen.
Code:
$request = mysql_query("SELECT a, b, c, d FROM asdf WHERE
		a = '$a' AND b = '$b' AND c = '$c' AND d='$d'");
Zu meinem Problem:
Ich möchte, dass jedoch wenn $a im Formulular nicht übergeben wird, auch die Zeile gefunden wird. Ich brauch also sowas wie:
Code:
$request = mysql_query("SELECT a, b, c, d FROM asdf WHERE
		if (!empty($a) {a = '$a' } AND b = '$b' AND c = '$c' AND d='$d'");
Ich hoffe ihr versteht mein Problem!
Liebe Grüße und Danke im Vorraus!
Jonas
 
Wenn ich das richtig verstanden habe, dann willst du also nach a suchen auch wenn a leer ist. Das hat für mich keinen Sinn :freak:
 
Nein, ich will schauen, ob b, c und d gleich sind, wenn a leer ist.
Also nehmen wir an ich schreibe ins formular:
a: [leer]
b: b
c: c
d: d

und in der sql-datenbank ist ein eintrag vorhanden:
a: a
b: b
c: c
d: d

dann soll der skript diesen eintrag ebenfalls auflisten
ich hoffe, ihr habts jetzt verstanden ;)
lg
jonas
 
wenns nur um a geht, das leer sein könnte, dann mach doch eine if anweisung:

wenn a leer dann mysql_query(b, c, d vergleichen)
sonst mysql_query(a, b, c, d vergleichen)

wenns noch mehr konstellationen gibt dann halt n paar elseifs
 
hi,
vielen dank für deine antwort.
aber leider sind es in wirklichkeit 8 felder und jedes muss, wenns leer ist, nicht gezählt werden.
das wären mal eben so 8! else-ifs das wären dann 8x8x8x8x8x8x8x8 else-ifs...
gehts nicht kürzer?
lg
 
hm, k .. also gibt sicher ne einfache lösung, aber ich seh sie auch grad nich ^^

ich würde mir die sql-abfrage zusammenbasteln:

erst mal ein array erzeugen mit allen sachen die du vergleichen willst array(a,b,c,d,e,f,g,h).
einen zähler $i auf 1.
dann ein foreach($array as value) wo du jedes element vergleichst ob es leer ist oder nicht, ist es nicht leer kommt es in ein neues array[$i] und $i erhöhen.
jetzt hast du ein array, mit schlüsseln 1-n in dem nur die buchstaben drin sind, die übergeben wurden und die du in der abfrage vergleichen willst.

jetzt bastele dir ein string-variable.

$string = "SELECT ";
beginn die forschleife des arrays und häng das element hinten an den string
$string = $string.$array[$i].", ";
nach der forschleife dem string hinten Zeichen entfernen, da beim letzten durchgang ein "," zuviel drangehängt wurde.
Select Anweisung ist fertig.
String weiter bauen:
$string = $string." FROM `xxxxx` WHERE ";
forschleife wieder von vorn beginnen und jetzt anhängen
$string = $string.$array[$i]."=".$array[$i]." AND ";
Nach letztem Durchgang ist ein AND wiederzuviel dran, entfernen!
Damit ist die sql-anweisung fertig und du führst sie aus mysql_query($string) :)

hoffe du kannst was damit anfangen ;)

[edit: man kanns sicher auch gleich mit foreach jedes mal machen anstatt sich erst das array für die for-schleife zu basteln, aber so machts nen verständlicheren eindruck, finde ich ^^]
 
Zuletzt bearbeitet:
hi,
ich finde zwar deine lösung sehr logisch, aber ich nimm den lösungsansatz, dass ich quasi den string aus einzelnen php-abfragen zusammenfüge und dann ausführe. jedoch mach ichs ohne array, da ich sie hasse :D
danke!
probiers morgen aus und melde mich morgen wieder.
lg
jonas

edit: ach ja: wie bring ich denn das letzte AND dann weg??
edit2: so, jetzt hab ichs so gebogen, dass $string folgendes ist:
"SELECT tierart, geschlecht, kastr_steri, rufname, rasse, farbe, kennzeichen, transponder, taet_li_o, taet_re_o, taet_li_s, taet_re_se, ausweis_no FROM asdf WHERE taet_li_o = ´uhj´ AND taet_re_o = ´ku´ AND taet_re_se = ´l´ AND ausweis_no = ´o´"
jetzt wenn ich aber
$request = mysql_query($string);
mache kommt die Fehlermeldung:
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\scripts\von\von_datenbank.php on line 80
An was liegt das??
Ach ja: Problem von edit1 besteht weiterhin!
lg
 
Zuletzt bearbeitet:
zu edit1:

schau dir mal die funktion substr an
http://www.php.net/substr

$string = substr($string, 0, -X)
musste ma bissel rumtesten wieviele zeichen da am ende nun weg kommen

zu edit2:

deine abfragebedingungen sehen so aus :

taet_li_o = ´uhj´

richtig müsste es sein:

`taet_li_o` = 'uhj'

auch den tabellen-namen in ` einschließen ( obwohls auch ohne geht ). allerdings kann die fehlermeldung auch was mit den elementen in der select anweisung zu tun haben, teste erst mal obs an der syntax liegt mit den hochkommas, bis morgen ;)
 
if(isset($a)){echo "a = '".$a."' AND";}
Denk du hast vergessen das AND in die if abfrage mit rein zu packen.
Was zu einem Fehler führt wenn das $a nicht gesetzt ist. (SQL fehler)

Weis jetzt nicht ob das $a von einem formular als $_POST kommt falls ja geht das ansonsten so könnte empty stimmen hab den php Befehl dafür aber nicht im Kopf.
 
Zuletzt bearbeitet:
Warum in PHP? SQL bietet auch If-Abfrage im Syntax.. und das ist wesentlich schneller als über PHP irgendwelche riesigen Konstrukte..

http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html

Alternativ gingen auch Wildcards mit LIKE.. oder auch Subquerys.. die immer noch schneller sein dürften wie PHP.. da MySQL Server viel schneller (zumindest ab der 5er Version) sind als der PHP-Parser..

MySQL bietet alles was man braucht..

PHP:
$sql = "SELECT (SELECT b.a FROM test b WHERE b.a LIKE '%".$a."%' LIMIT 1) AS a1, b, c, d
			FROM test
		WHERE b = '".$b."'
			AND c = '".$c."'
			AND d = '".$d."'
		ORDER BY id ASC";

Funktioniert sowohl wenn $a gefüllt ist oder halt auch nicht.. das kann man natürlich auch noch erweitern...

verstehe einer warum hier mit php angekommen wird..
 
@mister x:
du könntest deine meinung auch etwas netter ausdrücken...
ich will, wenn $a leer ist, aber in a in der sql was steht, dass trotzdem true ausgegeben werden soll!

@funart:
ich hab das AND in der abfrage, ich hab nicht isset sondern empty genommen, geht doch auch, oder?

@rain:
ja, das hatte ich mir auch schon gedacht, nur...wie mach ich hochkommas in php, dass sie auch ausgegeben werden?? bei mir schließt er immer den "text-bereich"
ich hoffe du weißt, was ich meine^^

lg
jonas



EDIT1:
man, bin ich doof^^ zauberwort ist escapen...
ich hab jetzt geschafft, dass $string folgendes ist:
"SELECT tierart, geschlecht, kastr_steri, rufname, rasse, farbe, kennzeichen, transponder, taet_li_o, taet_re_o, taet_li_s, taet_re_se, ausweis_no FROM asdf WHERE transponder = 'a' AND taet_li_o = 'b' AND taet_re_o = 'c' AND taet_li_s = 'd' AND ausweis_no = 'f'"
$request = mysql_query($string);

Wenn ich $request definiere mit:
"SELECT tierart, geschlecht, kastr_steri, rufname, rasse, farbe, kennzeichen, transponder, taet_li_o, taet_re_o, taet_li_s, taet_re_se, ausweis_no FROM asdf WHERE transponder = 'a' AND taet_li_o = 'b' AND taet_re_o = 'c' AND taet_li_s = 'd' AND taet_re_se = 'e' AND ausweis_no = 'f'"
Dann gehts, aber wenn ich $request selbst erstellen lasse (Selber Inhalt!!) funktionierts nicht.

Und wenn ich mache:
$request = mysql_query("SELECT tierart, geschlecht, kastr_steri, rufname, rasse, farbe, kennzeichen, transponder, taet_li_o, taet_re_o, taet_li_s, taet_re_se, ausweis_no FROM asdf WHERE transponder = 'a' AND taet_li_o = 'b' AND taet_re_o = 'c' AND taet_li_s = 'd' AND ausweis_no = 'f'");
dann gehts...aber das ist doch das selbe!





EDIT2:
*push*
Fehlen Infos?
Wäre echt dringend...
Und ich verzweifel schön langsam weil ich ja nicht weiß, warum das nicht geht *grml*
 
Zuletzt bearbeitet:
selbe fehlermeldung wie gestern?

setz ma die attribute in ` (nicht ´ bzw ' , sondern `), also ausweis_no etc. und auch den tabellennamen in `asdf`

$request = mysql_query($string); wäre es dann mit generierter abfrage. semikolon ganz zum schluss der abfrage auch noch mit rein.
 
Code:
"SELECT `tierart`, `geschlecht`, `kastr_steri`, `rufname`, `rasse`, `farbe`, `kennzeichen`, `transponder`, `taet_li_o`, `taet_re_o`, `taet_li_s`, `taet_re_se`, `ausweis_no` FROM `asdf` WHERE `transponder` = 'a' AND `taet_li_o` = 'b' AND `taet_re_o` = 'c' AND `taet_li_s` = 'd' AND `taet_re_se` = 'e' AND `ausweis_no` = 'f'"
Das gibt jetzt $string aus.
Aber leider gehts immer noch nicht =(
Ich poste hier mal den kompletten Coden, der übersicht halber:
PHP:
<?php

error_reporting(E_ALL);
$db_connection = mysql_connect('localhost', '*****', '*********');
$db = mysql_select_db('asdf');


$transponder = $_POST['transponder'];
$taet_li_o = $_POST['taet_li_o'];
$taet_re_o = $_POST['taet_re_o'];
$taet_li_s = $_POST['taet_li_s'];
$taet_re_se = $_POST['taet_re_se'];

$ausweis_no = $_POST['ausweis_no'];


$string = '"SELECT `tierart`, `geschlecht`, `kastr_steri`, `rufname`, `rasse`, `farbe`, `kennzeichen`, `transponder`, `taet_li_o`, `taet_re_o`, `taet_li_s`, `taet_re_se`, `ausweis_no` FROM `asdf` WHERE ';

if (!empty($transponder))
$string = $string."`transponder` = '".$transponder."' AND ";

if (!empty($taet_li_o))
$string = $string."`taet_li_o` = '".$taet_li_o."' AND ";

if (!empty($taet_re_o))
$string = $string."`taet_re_o` = '".$taet_re_o."' AND ";

if (!empty($taet_li_s))
$string = $string."`taet_li_s` = '".$taet_li_s."' AND ";

if (!empty($taet_re_se))
$string = $string."`taet_re_se` = '".$taet_re_se."' AND ";

if (!empty($ausweis_no))
$string = $string."`ausweis_no` = '".$ausweis_no."' AND ";
$string = substr($string, 0, -5);
$string = $string.'"';
echo $string;
$string = $string;
$request = mysql_query($string);


$ergebnisse = mysql_fetch_row($request);
if (empty($ergebnisse)) {


echo '<font size=6 face="Trebuchet MS"><u>Leider keine Übereinstimmungen in der Datenbank gefunden!</u></font><br />
<font face="Trebuchet MS"><a style="text-decoration:none" href="formular.php">Zurück zum Formular</a></font><br /><br />';


} else {
echo '<table width=100% border=0>';
echo '<font size=6 face="Trebuchet MS"><u>Folgende Übereinstimmungen wurden in der Datenbank gefunden:</u></font><br />';
echo'
<tr>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Tierart</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Geschlecht</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Kastriert/<br />Sterilisiert</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Rufname</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Rasse</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Farbe</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Kennzeichen</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Transponder</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Tätovierung<br />linkes Ohr</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Tätovierung<br />rechtes Ohr</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Tätovierung<br />linker Schenkel</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">Tätovierung<br />rechter Schenkel</td>
<td  align=center valign=center width=7,69%><font size=4 face="Trebuchet MS">EU-Ausweis-Nr.</td></tr>';

while($row1 = mysql_fetch_assoc($request)) {

echo '<tr height=10px><td align=center valign=center></td></tr>';
	echo'<tr>';
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['tierart'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['geschlecht'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['kastr_steri'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['rufname'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['rasse'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['farbe'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['kennzeichen'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['transponder'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['taet_li_o'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['taet_re_o'];
	echo '</td>';
	
	echo '<td align=center valign=center>';	
	echo '<font face="Trebuchet MS">'.$row1['taet_li_s'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['taet_re_se'];
	echo '</td>';
	
	echo '<td align=center valign=center>';
	echo '<font face="Trebuchet MS">'.$row1['ausweis_no'];
	echo '</td>';
	
	echo '</tr>';
echo '<tr height=10px><td align=center valign=center></td></tr>';
}
echo '</table>';
}
error_reporting(E_ALL);
?>
 
wie schon grad gefragt, welche fehlermeldung kommt?
weiterhin verwende ich lieber " bei strings als ', jedenfalls $string = '"SELECT ` ist irgendwie doppelt gemoppelt ;) entweder ' oder " am anfang (und ende), obs nur mit ' geht weiß ich nich, ich verwende wie gesagt nur " bei strings (und escape sie dementsprechend auch im string wenn ichs brauche).

gib mal nach dem string-konstrurieren $string aus und gugg ma ob alles so ist wie es sein soll
 
Ja, die selbe Fehlermeldung
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in C:\xampp\htdocs\scripts\von\von_datenbank.php on line 81
ich hab jetzt alle ' durch " ausgetauscht.
wenn ich mit echo $string; ausgebe, kommt folgende dabei raus:
"SELECT `tierart`, `geschlecht`, `kastr_steri`, `rufname`, `rasse`, `farbe`, `kennzeichen`, `transponder`, `taet_li_o`, `taet_re_o`, `taet_li_s`, `taet_re_se`, `ausweis_no` FROM `asdf` WHERE `transponder` = 'a' AND `taet_li_o` = 'b' AND `taet_re_o` = 'c' AND `taet_li_s` = 'd' AND `taet_re_se` = 'e' AND `ausweis_no` = 'f'"
Und hier passt ja alles 100%
Wenn ich den code jetzt manuell über die datei einfüge funktionierts ja super...
 
wenn du den string generien lässt und ihn so an mysql_query gibst, kommt die fehlermeldung. gibst du den string aus, kopierst ihn und fügst als argument bei mysql_query ein, funktionierts also? das ist dann mal echt komisch. vielleicht hängts noch an den mysql_fetch_assoc .. versuchs mal mit mysql_fetch_array. aber so langsam wirds nur noch trial&error. versuche den fehler mal einzugrenzen. erzeuge eine einfach abfrage als $string und schaue obs dann geht. kannst dich nur noch an den fehler rantasten. notfalls schick mir die datenbank per mail und ich der sache morgen mal nach. adresse bekommste wenn du mir ne pm schickst
 
Hi, mysql_fetch_array hat nicht geklappt, schön langsam bin ich echt ziemlich verwirrt...
schick die jetzt alle daten per pm!
danke für die hilfe!
spiel mich jetzt noch bisl...
 
Ich würd mal überprüfen ob die MySQL Abfrage richtig läuft

PHP:
if (!$request) {
   echo "Fehler: ".mysql_error();
else {
   echo "Die MySQL Abfrage ist Fehlerfrei!";
}
 
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 '"SELECT `tierart`, `geschlecht`, `kastr_steri`, `rufname`, `rasse`, `farbe`, `ke' at line 1
Ich denke, ihr könnt damit was anfangen^^
 
Zu erst einmal solltest du statt diesem ` ' verwenden (ist bei dem Raute zeichen zu finden). Stimmen die Spalten-Angaben 1zu1 mit denen aus deiner SQL Datenbank überein, Auch die Groß- und Kleinschreibung? Denn die Abfrage ist Keysensitiv!
 
Zurück
Oben