lege zoekvelden niet meenemen in query

  • Onderwerp starter Onderwerp starter Jors
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Jors

Gebruiker
Lid geworden
1 okt 2006
Berichten
142
Weer een vraag, hopelijk deze keer een makkelijke.

Ik gebruik de volgende code om te zoeken in een tabel:

PHP:
("SELECT * FROM tabel1 WHERE (COL1 LIKE '%$VAR1%' OR COL2 LIKE '%VAR1%')
  AND (COL3 LIKE '$VAR2')
  AND (COL4 < '$VAR3')");

De variabelen komen uit een formulier dmv $_POST.

Dit werkt op zich prima, maar nu wil ik dat op het moment dat een veld van het zoekformulier leeg blijft, deze niet meegenomen wordt in de query.

Ik heb al iets geprobeerd als:

PHP:
if ($VAR1 = ""){
$VAR1 = 'NULL';

maar dat werkt dus niet. Hoe los ik dit op?
 
De query met de hand opbouwen.

PHP:
if ($VAR1 <> ""){
    $querybuild[] = "(COL1 LIKE '%$VAR1%' OR COL2 LIKE '%VAR1%')";
}
if ($VAR2 <> ""){
    $querybuild[] = "(COL3 LIKE '$VAR2')";
}

if ($VAR3 <> ""){
    $querybuild[] = "(COL4 < '$VAR3')";
}

$totquery = "SELECT * FROM tabel1 WHERE " . implode(" AND ", $querybuild);
 
Aha, ziet er uit als een goede optie. Wat is de betekenis van die "[]" ? Wordt de variabele op die manier telkens aangevuld?

Wat ik overigens wel gek vind is dat $VAR1 (zie voorbeeld) wel leeg kan blijven, terwijl $VAR2 en $VAR3 wel een waarde moeten hebben.
$VAR1 is een gewoon tekstveld, $VAR2 komt uit een dropdownlist en $VAR3 is numeriek (vandaar het "<" teken). Zit daar het verschil in?

//update:

Ik heb nu de code getest en helaas werkt het nog steeds niet.
Er moet nu minimaal 1 waarde ingevuld worden (ongeacht welke) voor er resultaten weergegeven worden. Dus als alle zoekvelden leeg zijn laat hij niets zien ipv alles. Is hier nog een oplossing voor?
 
Laatst bewerkt:
$querybuild moet je nog typecasten als een array
$querybuild = array();
en dan doet $querybuild[]
hiermee vul je de array en krijgen de gegevens automatisch de volgende index
 
Overnemen aangevinkte items werkt wel in Safari maar niet in IE

En nog een vraag, nu we toch bezig zijn:

Ik heb een tabel met records die weergegeven worden met een aankruisvakje ervoor. De records die aangekruist worden moeten na het klikken op een knop overgenomen worden in een tweede tabel.

Dit heb ik aan de praat gekregen, echter alleen in Safari. In IE werkt het overnemen van het aangevinkte record alleen bij het laatste record uit tabel1. Bij het aanvinken van de rest gebeurt er ogenschijnlijk niets.

Hier is de code van het formulier met de checkbox:

PHP:
<?php    
	 while ($row = mysql_fetch_array($sql)) {
	 $id = $row['ID'];
	 $VAR2 = $row['COL2'];
	 $VAR3 = $row['COL3'];
	 $VAR4 = $row['COL4'];
	 $VAR5 = $row['COL5'];
	?>

<tr><form method="post">
    <td><input type="checkbox" name="check[]" value="<?php echo $id;?>" /></td>
    <td><?php echo $VAR1;?></td>
    <td><?php echo $VAR2;?></td>
    <td><?php echo $VAR3;?></a></td>
    <td><?php echo $VAR4;?></td>
    <td><?php echo $VAR5;?></td>
    </tr>
    <?php } ?>
    </table>
    <input type="submit" value="Selecteer" />
    </form>

en hier de wijze waarop deze naar de nieuwe tabel gestuurd worden:

PHP:
$checked = $_POST['check'];
foreach($checked as $item) {
	$data = mysql_query("SELECT * FROM tabel1 WHERE ID='$item'");
	while ($row_b = mysql_fetch_array($data)) {
		$b_VAR1 = $row_b['COL2'].".".$row_b['COL1'];
		$b_VAR3 = $row_b['COL3'];
		$b_VAR4 = $row_b['COL4'];
		$b_VAR5 = $row_b['COL5'];
		$b_VAR6 = $row_b['COL6'];
		$b_VAR7 = $row_b['COL7'];
		$b_VAR8 = $row_b['COL8'];
		$b_VAR9 = $row_b['COL9l'];
		$begroting = "INSERT INTO tblBegroting(ID, COL2, COL3, etc) VALUES('NULL','".$b_VAR2."', '".$b_VAR3."',etc)";
		mysql_query($begroting) or die("Fout: ".mysql_error);
		}
	}

De vraag is dus of er een fout in de code zit, of dat dit een bekend iets is met IE.
En wellicht nog belangrijker; hoe los ik het op?
 
Excuus dit was eigenlijk bedoelt als volgende topic...
 
Ik heb nu de code getest en helaas werkt het nog steeds niet.
Er moet nu minimaal 1 waarde ingevuld worden (ongeacht welke) voor er resultaten weergegeven worden. Dus als alle zoekvelden leeg zijn laat hij niets zien ipv alles. Is hier nog een oplossing voor?

Ik nam eigenlijk aan dat dat de reactie was die je wenste. Niet veel mensen willen hun hele tabel op het scherm gedumpt hebben als je niets invult ;)

PHP:
if(isset($querybuild[0]))
{
     ...
}
else
{
     $totquery = "select * From table";
}

... is de code die je al had. Ik had inderdaad de variabele niet gedefinieerd. Ik nam eigenlijk aan dat je bekend was de notatie. Mijn excuses hiervoor.

Denk er wel aan dat alle code die je tot nu toe hebt gepost niet beveiligd is tegen SQL injectie. Neem dit wel serieus in de uiteindelijke code tenzij het strict voor persoonlijk gebruik is.
 
Oh ik geloof dat ik m begrijp ja :) Ik moet dus bovenstaande code + $querybuild = array(); toevoegen. Dat zal ik morgen meteen proberen.


Dat ik de hele tabel wilde dumpen komt omdat deze niet heel groot is, dus vooralsnog wil ik mensen die optie geven. Wat betreft de SQL injectie, daar ben ik nog niet helemaal van op de hoogte maar ik zal me er in verdiepen. Iig bedankt voor de waarschuwing.
 
De query met de hand opbouwen.

PHP:
if ($VAR1 <> ""){
    $querybuild[] = "(COL1 LIKE '%$VAR1%' OR COL2 LIKE '%VAR1%')";
}
if ($VAR2 <> ""){
    $querybuild[] = "(COL3 LIKE '$VAR2')";
}

if ($VAR3 <> ""){
    $querybuild[] = "(COL4 < '$VAR3')";
}

$totquery = "SELECT * FROM tabel1 WHERE " . implode(" AND ", $querybuild);

Ik heb hier toch nog een vraag over, omdat er met de code hierna iets mis gaat en ik wil zeker wil zijn dat het niet haar aan ligt.

Met name dit stuk:
PHP:
$totquery = "SELECT * FROM tabel1 WHERE " . implode(" AND ", $querybuild);

Moet de SELECT regel niet afgesloten worden met een " ? Dus het stuk na de implode zeg maar. Of is deze code 100% foutloos?
 
je kun gewoon echo $totquery doen, dan zie je of de query juist is en je kunt hem ook nog copy en dan in myadmin testen
 
hhm logisch, stom dat ik daar zelf iet op kom :S

Anyway, query ziet er goed uit, zal het dus niet aan liggen.

Wat me nog niet geheel duidelijk is; soms zie ik voorbeelden met echo "tekst" en soms met echo 'tekst'. Dus wat ik me afvraag is wanneer je nou " en wanneer je ' gebruikt. Niet zozeer bij echo maar meer in het algemeen.
 
het gebruik maak geen verschil. Het is alleen verstandig om vooraf na te denken wat je wilt weer geven.
Als je bv html gebruik, dan zou ik ' gebruiken omdat in html vaak bv href="link" gebruikt word en dan hoe je ze net te escapen
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan