Haaai,
Ik zit weer even helemaal vast en ik weet even niet meer waar ik het zoeken moet, wie geeft me een tip en kan mij vertellen waar ik de mist in ga.
Ik heb twee tabellen: opdracht en afleverbedrijf
opdracht (id, titel, week, module)
afleverbedrijf (id, naam, regio, route, modules)
In een zoekopdracht word gevraagd naar de 'week' en de 'regio'
Nou wil ik in de print.php een lijst hebben van opdrachten per afleverbedrijf in die bepaalde week en die bepaalde regio. So far so good, maar nou komt het: elke opdracht krijgt bepaalde modules toegewezen, deze kunnen varieren tussen A en Z en meerdere opties is ook mogelijk (vb AFJSZ), maar ook het afleverbedrijf heeft modules (vb. BCFKN). Nou moet ik iets verzinnen dat als ook maar er 1 letter overeen komt moet hij hem weergeven. ik heb nu dit, maar dat is natuurlijk niet goed omdat er nu een '=' staat en hij daarom alleen degene weergeven met de precieze lettercombinatie:
<?php
require("../include/config.php");
mysql_connect($database[host],$database[username],$database[password]);
mysql_select_db($database[dbnaam]);
$sql = "
SELECT opdracht.*, afleverbedrijf.*
FROM opdracht, afleverbedrijf
WHERE opdracht.module = afleverbedrijf.modules
AND afleverbedrijf.regio LIKE '" . $_POST['regio'] . "'
AND opdracht.week LIKE '" . $_POST['week'] . "'
ORDER BY afleverbedrijf.route";
$query = mysql_query($sql);
while($fetch_arr = mysql_fetch_array($query)){
echo $fetch_arr[naam]. "-". $fetch_arr[titel]."-". $fetch_arr[module]."-". $fetch_arr[modules]."-". $fetch_arr[route]."-". $fetch_arr[regio]."-". $fetch_arr[week]."<BR><BR>";
}
?>
Wie kan mij een zet geven in de goede richting, want ik zit op het moment even in een draaimolen en kom er niet vanaf!!
Je hebt inderdaad je opdracht_id nodig, dat was een foutje van mij. De id die je in je 1e tabel hebt wordt gekoppeld aan de letter van de module die het heeft. Dus je krijgt bijvoorbeeld:
ID - OpdrachtID - ModuleID
1 2 A
2 3 S
3 5 D
4 2 F
5 2 H
6 4 A
Zo bijvoorbeeld, maar de 2e oplossing, of het 2e deel van de post hiervoor zou ook nog kunnen.
Ok dus ik moet alleen de opdrachtID doen en niet de afleverbedrijfID. Ga ik even proberen.
Die 2e optie, lijkt me helemaal geweldig en die wil ik heuuul graag, alleen die krijg ik niet aan de praat....
Variabele moet neem ik aan het hele alfabeth zijn? Als ik bij de if een echootje plaats dan krijg ik gewoon 26 keer die echo, (met 5 letters in de variabele krijg ik er maar 5) en de else komt er nooit uit.
Je moet het zo zien, die if is alleen voor het eerste teken (de 1e letter) om de WHERE clause aan te maken. $variable moet je zoekopdracht zijn, als het goed is en je echo't meteen na het afsluiten van de for lus de variabele $where, dan zou je zoiets te zien moeten krijgen:
WHERE opdracht.module LIKE '%A%' OR opdracht.module LIKE '%F%' OR opdracht.module LIKE '%K%' OR opdracht.module LIKE '%G%'
We zijn denk ik alweer een stukje verder!! Ik heb nu deze code:
<?php
$sql = "SELECT opdracht.*, afleverbedrijf.* FROM opdracht, afleverbedrijf WHERE afleverbedrijf.regio LIKE '" . $_POST['regio'] . "' AND opdracht.week LIKE '" . $_POST['week'] . "' order by afleverbedrijf.route ";
$query = mysql_query($sql);
while($fetch_arr = mysql_fetch_array($query)){
echo "<BR>".$fetch_arr[naam]. "-". $fetch_arr[titel]."-". $fetch_arr[module]."----". $fetch_arr[modules]."-". $fetch_arr[route]."-". $fetch_arr[regio]."-". $fetch_arr[week]."<BR>";
$variable = $fetch_arr[modules];
$aantal = strlen($variable);
for($i=0;$i<$aantal;$i++){
if($i == 0){
$where = " WHERE opdracht.module LIKE '%".substr($variable,$i,1)."%'";
echo $fetch_arr[naam]."<BR>";
}
else{
$where .= " OR opdracht.module LIKE '%".substr($variable,$i,1)."%'";
}
}}
?>
Het resultaat ziet er al iets beter uit alleen opdracht met de module AK wordt nog steeds getoond bij afleverbedrijf met de modules GHF, hoe kan dit dan?
Omdat je het niet goed doet, :) Je haalt eerst nu je modules op, en dan ga je je WHERE clause die in je SQL code moet komen aanmaken, het zou zo moeten geloof ik:
<?php
$variable = $zoekmodules;// hier moeten de modules komen waar je op wil zoeken, $_POST['zoek'] ??
$aantal = strlen($variable);
for($i=0;$i<$aantal;$i++){
if($i == 0){
$where = "opdracht.module LIKE '%".substr($variable,$i,1)."%'";
echo $fetch_arr[naam]."<BR>";
}
else{
$where .= " OR opdracht.module LIKE '%".substr($variable,$i,1)."%'";
}
}
$sql = "SELECT opdracht.*, afleverbedrijf.* FROM opdracht, afleverbedrijf WHERE afleverbedrijf.regio LIKE '" . $_POST['regio'] . "' AND opdracht.week LIKE '" . $_POST['week'] . "' ". $where ." ORDER BY afleverbedrijf.route ";
echo $sql;// even kijken of je query er nu goed uit ziet
$query = mysql_query($sql);
Variabelen die via de browser zijn doorgegeven, bv. POST en GET, mag je nooit zomaar in een query zetten. Hiermee zet je de deuren wagenwijd open voor SQL-injection. Gevolg: Iedere grappenmaker kan jouw database naar de bliksem helpen...
Oplossing: Gebruik PDO om een verbinding met de database te maken of ga met de functie mysql_real_escape_string() alle user-input beveiligen. Zie de handleiding hoe je dit kunt aanpakken.
@Robert: Waarschijnlijk doe ik nog iets niet goed...... maar de modules staan niet in de zoekfunctie, ze staan in de opdracht.module en de afleverbedrijf.modules en die moet vergelijken worden. In de zoekopdracht staan de opdracht.week en de afleverbedrijf.regio. Door de modules te vergelijken moet er vervolgens een lijst uitkomen rollen.
@Frank: Ziet er zeker interessant uit, alleen wil ik nu eerst dit aan de praat krijgen voordat ik me daar in ga storten. Voorlopig staat de website nog in een beschermde omgeving namelijk. Maar thanx voor de tip!!
@Frank: Ziet er zeker interessant uit, alleen wil ik nu eerst dit aan de praat krijgen voordat ik me daar in ga storten. Voorlopig staat de website nog in een beschermde omgeving namelijk. Maar thanx voor de tip!!
Dit klinkt logisch, maar het beste is om vanaf het begin ook aan je beveiliging te denken. Want anders kun je er van op aan dat je het ergens vergeet.
En om er dan achter te komen als iemand het misbruikt is niet bepaald prettig te noemen.
Ik weet het en zal het ook netjes doen (doe het echt, geloof me!), maar ik moet eerst dit probleem oplossen. Vanaf dat moment kan ik weer rustig slapen en heb ik alle tijd om pdo uit te zoeken!