[PHP] sql uitlees probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hey,

Ik heb dus een resultaten pagina met vier selectboxen erboven waarmee je de resultaten kan verfijnen.
Dit is mijn sql query:

code:
1
SELECT * FROM resultaten WHERE jaar = '".$_POST["jaar"]."' AND lokatie = '".$_POST["lokatie"]."' AND spel = '".$_POST["spel"]."' AND toernooi = '".$_POST["toernooi"]."' ORDER BY resultaat_id


Alleen nu laat hij de resultaten pas zien als je bij alle vier de selectboxen iets hebt geselecteerd. Dat moet ie dus al laten zien als je bijvoorbeeld alleen het jaar heb geselecteerd.

Wat moet ik dan doen?

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Wat denk je dat je moet doen? Welke vragen wil jouw resultatenpagina beantwoord zien?

bijvoorbeeld:
Indien selectbox1 een serieuze waarde bevat, dan moet ik die in mijn select statement opnemen, anders niet.

etc...

Je kunt je select statement vervolgens met if-jes o.i.d. samenstellen zoals hij moet zijn.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik if else structuur gebruik in mn query dan krijg ik een error:

Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/zaxor/domains/team-spigotty.net/public_html/cea/results.php on line 163

Wat doe ik fout, moet ik die op een speciale manier toepassen?

Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 11-09 22:11

TheBorg

Resistance is futile.

Wat was je code dan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if($_POST["year"] != "") {
$year = "result_year = '".$_POST["year"]."' AND";
} else {
$year = "";
}

if($_POST["location"] != ""){
$location = "result_location = '".$_POST["location"]."' AND";
} else {
$location = "";
}

if($_POST["game"] != ""){
$game = "result_game = '".$_POST["game"]."' AND";
} else {
$game = "";
}

if($_POST["event"] != ""){
$event = "result_event_name = '".$_POST["event"]."'";
} else {
$event = "";
}

$result_SQL = "SELECT 
* 
FROM 
results 
WHERE 
$year $location $game $event
ORDER BY result_date DESC, resultid DESC"; 
$result_result = mysql_query($result_SQL) or die(mysql_error());


Krijg nu deze error:
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 'ORDER BY result_date DESC, resultid DESC' at line 7

[ Voor 67% gewijzigd door Verwijderd op 17-10-2005 19:44 ]


Acties:
  • 0 Henk 'm!

  • TheBorg
  • Registratie: November 2002
  • Laatst online: 11-09 22:11

TheBorg

Resistance is futile.

Doe maar eens een 'echo $result_SQL;' dan zie je meteen wat er fout is.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dit is de output daarvan:
SELECT * FROM results WHERE result_year = '2005' AND ORDER BY result_date DESC, resultid DESC

Hoe kan ik er het beste voor zorgen dat ie AND niet laat zien als er niet op nog iets geselecteerd wordt?

heb de code trouwens een beetje aangepast:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
if($_POST["year"] != "") {
$year = "result_year = '".$_POST["year"]."' AND";
} else {
$year = "";
}

if($_POST["location"] != ""){
$location = "result_location = '".$_POST["location"]."' AND";
} else {
$location = "";
}

if($_POST["game"] != ""){
$game = "result_game = '".$_POST["game"]."' AND";
} else {
$game = "";
}

if($_POST["event"] != ""){
$event = "result_event_name = '".$_POST["event"]."'";
} else {
$event = "";
}

if($_POST["year"] == "" and $_POST["location"] == "" and $_POST["game"] == "" and $_POST["event"] == "") {
echo "";
} else {
$result_SQL = "SELECT 
                        * 
                FROM 
                        results 
                WHERE 
                        $year $location $game $event
                ORDER BY result_date DESC, resultid DESC";

[ Voor 65% gewijzigd door Verwijderd op 17-10-2005 20:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Heb je beschikking over php5 want daar zit eindelijk iets functioneels in, prepared statements:
http://www.zend.com/php5/articles/php5-mysqli.php

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb ook iets dergelijks, je zou het op de volgende manier kunnen doen:

(ik heb het vertaald vanuit c#, weet niet of alles ook zo werkt in php)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$query = new Array();
if($_POST["year"] != "") {
$query[] = "result_year = '".$_POST["year"]
} 
...

// en uiteindelijk:

$count = 1;
$query_string = "";
foreach ($query as $restrict) {
  if (count == $query.count) {
    $query_string += $restrict;
  }
  else {
     $query_string += $restrict." AND";
  }
  $count++;
}
// in $query_string staat nu de goede query, zonder laatste AND.

[ Voor 24% gewijzigd door Verwijderd op 18-10-2005 12:40 ]


Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
Verwijderd schreef op maandag 17 oktober 2005 @ 20:23:
Hoe kan ik er het beste voor zorgen dat ie AND niet laat zien als er niet op nog iets geselecteerd wordt?
Append de AND bij het volgende deel van de string!

Al met al maak je het jezelf behoorlijk ingewikkeld terwijl je maar 1 query wilt opbouwen! Ik zou er zoiets van maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "SELECT * 
        FROM results
        WHERE ":

if($_POST["year"] != "")
    $sql .= "result_year = '" . $_POST["year"] . "'\n";

if($_POST["location"] != "")
    $sql .= "AND result_location = '" . $_POST["location"] . "'\n";

if($_POST["game"] != "")
    $sql .= "AND result_game = '" . $_POST["game"] . "'\n";

if($_POST["event"] != "")
    $sql .= "AND result_event_name = '" . $_POST["event"] . "'\n";

$sql bevat nu je complete query zonder overbodige 'AND' statements ;) (ongeteste code trouwens ;))

[ Voor 18% gewijzigd door PhoeniX- op 18-10-2005 13:30 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Dit werkt niet, want als year niet geset is, zal de query beginnen met AND :)

Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
Verwijderd schreef op dinsdag 18 oktober 2005 @ 13:31:
Dit werkt niet, want als year niet geset is, zal de query beginnen met AND :)
Hmm, dat is het nadeel van zomaar wat uittypen in notepad zonder het te testen ;)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$sql = "SELECT * 
        FROM results
        WHERE ":

if($_POST["year"] != "")
    $and = true;
    $sql .= "result_year = '" . $_POST["year"] . "'\n";

if($_POST["location"] != "")
    $sql .= ($and) ? "AND " : "";
    $and = true;
    $sql .= "result_location = '" . $_POST["location"] . "'\n";

if($_POST["game"] != "")
    $sql .= ($and) ? "AND " : "";
    $and = true;
    $sql .= "AND result_game = '" . $_POST["game"] . "'\n";

if($_POST["event"] != "")
    $sql .= ($and) ? "AND " : "";
    $and = true;
    $sql .= "AND result_event_name = '" . $_POST["event"] . "'\n";

Zoiets dan? Verder zoeken jullie het maar lekker zelf verder uit :p

Acties:
  • 0 Henk 'm!

Verwijderd

Vind ik mijn oplossing toch mooier :)

Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
Da's zo, maar hij is ook onleesbaar ;)

Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Oh, en zet ALSJEBLIEFT geen post-variabelen direct in je SQL query! Doe liever iets als:

code:
1
2
3
4
5
6
7
8
9
$year = $_POST['year'];
if(is_int($year) && $year > 1900 && $year < 3000) 
{
   //Dostuff
}
else
{
   die("Invalid input!");
}


SQL injection exploits komen erg vaak voor.

[ Voor 12% gewijzigd door Hydra op 18-10-2005 13:44 ]

https://niels.nu


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Waarom zo moeilijk maken?
1/ Creëer een aparte variabele voor de voorwaarden in het WHERE-statement
2/ Voeg daaraan de verschillende voorwaarden toe als ze nodig zijn
3/ Voor je elke voorwaarde toevoegt, controleer je de lengte van je variabele ... groter dan 0 ==> AND voor zetten.

Ben je er overigens zeker van dat in het veld jaar een STRING zit ... lijkt me niet echt correct :? Als dat niet het geval is, moet je de quotes weghalen van rond je jaarvariabele.

Overigens lijkt het me wel zo netjes om eerst alle post-variabelen op te vangen in aparte variabelen ... indien gewenst, kan je dan default waarden meegeven. overbodig

[ Voor 2% gewijzigd door edeboeck op 18-10-2005 13:50 . Reden: Hydra was me voor ]


Acties:
  • 0 Henk 'm!

  • Vesta
  • Registratie: November 2004
  • Niet online
$_POST['year'] zal alleen altijd een string zijn, gebruik dus is_numeric() of intval()
PHP:
1
$year = intval( $_POST['year'] );

Edit: reactie op Hydra

[ Voor 17% gewijzigd door Vesta op 18-10-2005 13:51 ]


Acties:
  • 0 Henk 'm!

  • Erycius
  • Registratie: Januari 2003
  • Laatst online: 09-03 00:32

Erycius

I came on Eileen.

PhoeniX- schreef op dinsdag 18 oktober 2005 @ 13:37:
[...]

Hmm, dat is het nadeel van zomaar wat uittypen in notepad zonder het te testen ;)

Zoiets dan? Verder zoeken jullie het maar lekker zelf verder uit :p
ik doe het altijd zo:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "SELECT * 
        FROM results
        WHERE 1=1 ":

if($_POST["year"] != "")
    $sql .= " AND result_year = '" . $_POST["year"] . "'\n";

if($_POST["location"] != "")
    $sql .= "AND result_location = '" . $_POST["location"] . "'\n";

if($_POST["game"] != "")
    $sql .= "AND result_game = '" . $_POST["game"] . "'\n";

if($_POST["event"] != "")
    $sql .= "AND result_event_name = '" . $_POST["event"] . "'\n";


Oud truukje :)

Bloemen scheiden het gras in de tuin.


Acties:
  • 0 Henk 'm!

  • PhoeniX-
  • Registratie: Juni 2000
  • Laatst online: 01-09 10:26
edeboeck schreef op dinsdag 18 oktober 2005 @ 13:48:
Waarom zo moeilijk maken?
1/ Creëer een aparte variabele voor de voorwaarden in het WHERE-statement
2/ Voeg daaraan de verschillende voorwaarden toe als ze nodig zijn
3/ Voor je elke voorwaarde toevoegt, controleer je de lengte van je variabele ... groter dan 0 ==> AND voor zetten.
Uiteindelijk maken we het dus even moeilijk, alleen gebruik ik een boolean om te checken voor een where clause en jij een strlen. :P
EryciusPuteanus schreef op dinsdag 18 oktober 2005 @ 13:53:
ik doe het altijd zo:
PHP:
1
2
3
$sql = "SELECT * 
        FROM results
        WHERE 1=1 ";
Die ga ik onthouden ;)

[ Voor 19% gewijzigd door PhoeniX- op 18-10-2005 13:55 ]


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 14:53

Dido

heforshe

Verwijderd schreef op dinsdag 18 oktober 2005 @ 13:31:
Dit werkt niet, want als year niet geset is, zal de query beginnen met AND :)
Daarom is het handig om te beginnen met:
code:
1
select blaat from tabel where 1 = 1

vervolgens voeg je 0 tot oo keer toe:
code:
1
 AND blaat=woei!


Sneller typen 8)7

[ Voor 5% gewijzigd door Dido op 18-10-2005 13:56 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
Vesta schreef op dinsdag 18 oktober 2005 @ 13:48:
$_POST['year'] zal alleen altijd een string zijn, gebruik dus is_numeric() of intval()
PHP:
1
$year = intval( $_POST['year'] );

Edit: reactie op Hydra
Zal best, ik heb al in geen jaren meer PHP aangeraakt, dus dat was uit 't blote hoofd. Ik denk dat wel duidelijk was wat ik bedoel :)

https://niels.nu


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 15:22
Ik zou het persoonlijk liever zo doen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//fields 
$fields = array (
    'year' => 'result_year',
    'location' => 'result-location',
    'game' => 'result_game',
    'event' => 'result_event'
);

//create condtions
foreach ($fields as $postVar => $dbField) {
    if (!empty($value = $_POST[$postVar])) {
        /** 
         * you should (!) actually check the input here 
         */
        $whereConditions[] = $dbfield .' = ' .$value;
    }
}

//combine conditions
$whereClause = (isset($whereConditions)) ? ' WHERE ' .implode(' AND ', $whereConditions) : '';

//generate query
$SQL = 'SELECT * FROM `results`'. $whereClause;

Dat is lekker makkelijk uit te breiden, hell, je zou er zelfs een functie uit kunnen trekken :)

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Een for loop is daarentegen wel langzamer dan een if statement. Denk alleen niet dat dat nu relevant is :P
Pagina: 1