Avatar billede lsskaarup Nybegynder
24. maj 2005 - 09:30 Der er 6 kommentarer og
1 løsning

Indsætter escapekaraktere i forespørgelsestreng

Jeg har nogle sider, som viser diverse udtræk fra db. Hver kolonne har deres egen overskrift, og klikker man på den, får man sorteret udtrækket efter overskriften. Men den opfører sig mærkeligt i enkelte tilfælde.

Koden som laver overskrifterne og sætter sorteringsvariablen:
<tr>
<td class="content" width="5" valign="top">&nbsp;</td>
<td width="70px" class="content" valign="top"><b><a href="#" onClick="return setSort('t.tilbud asc');">Tilb. nr</a></b></td>
<td width="110px" class="content" valign="top" style="text-align: left;"><b><a href="#" onClick="return setSort('forventet');">Tilb. forv. dato</a></b></td>
<td width="100px" class="content" valign="top"><b><a href="#" onClick="return setSort('projektleder');">Projektleder</a></b></td>
<td class="content" valign="top"><b><a href="#" onClick="return setSort('kunde');">Kunde</a></b></td>
<td class="content" valign="top"><b><a href="#" onClick="return setSort('bygherre');">Bygherre</a></b></td>
</tr>

Koden som fanger variablen, og sætter sorteringsvariablen til den rigtige sortering:
    if (isset($_POST['sort'])) {
        if ($_POST['sort'] == projektleder)    {
            $sort = "IF((t1.r1 = '' || t1.r1 IS NULL),1,0), t1.r1 ASC";
        } else if ($_POST['sort'] == forventet){
            $sort = "IF((t1.r4 = 0000-00-00  || t1.r4 IS NULL),1,0), t1.r4 ASC";
        } else if ($_POST['sort'] == kunde){
            $sort = "IF((t1.r9 = '' || t1.r9 IS NULL),1,0), t1.r9 ASC";
        } else if($_POST['sort'] == bygherre){
            $sort = "IF((t1.r18 = '' || t1.r18 IS NULL),1,0), t1.r18 ASC";
        } else {
            $sort = $_POST['sort'];
        }
    }

Query:
$query = "SELECT t.tilbud, t.rev, t1.tilbudsnummer, t1.r2, UNIX_TIMESTAMP(t1.r4) as r4, t1.r9, t1.r18, t.status, k.navn1, t1.r14, t1.r1, t5.r504, t5.r526a, (TO_DAYS(t1.r4)-TO_DAYS(NOW())) AS datemark FROM tilbud AS t, tilbud0 AS t1 LEFT JOIN kunde AS k ON t1.r14=k.id LEFT JOIN tilbud5 AS t5 ON t1.tilbudsnummer=t5.tilbudsnummer WHERE t1.tilbudsnummer=t.id && (t5.r526a='0' || t5.r526a IS NULL)".$betingelse."ORDER BY $sort, t.id ASC";

Fejlen opstår når jeg først har vist en sortering på alle projektledere, og derefter vælger kun at få vist får en projektleder, så får jeg følgende fejl:

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 '\'\' || t1.r1 IS NULL),1,0), t1.r1 ASC, t.id ASC' at line 3

Selve queryen ser nu sådanne ud:
SELECT t.tilbud, t.rev, t1.tilbudsnummer, t1.r2, UNIX_TIMESTAMP(t1.r4) as r4, t1.r9, t1.r18, t.status, k.navn1, t1.r14, t1.r1, t5.r504, t5.r526a, (TO_DAYS(t1.r4)-TO_DAYS(NOW())) AS datemark FROM tilbud AS t, tilbud0 AS t1 LEFT JOIN kunde AS k ON t1.r14=k.id LEFT JOIN tilbud5 AS t5 ON t1.tilbudsnummer=t5.tilbudsnummer WHERE t1.tilbudsnummer=t.id && (t5.r526a='0' || t5.r526a IS NULL) && t1.r1 = '12037' ORDER BY IF((t1.r1 = \'\' || t1.r1 IS NULL),1,0), t1.r1 ASC, t.id ASC

Det er klart at det er på grund af de 2 escapekaraktere \\, men jeg har dem da ingen steder i koden. Og går jeg bare ind på siden, og fra start vælger en bestemt projektleder, så fejler den ikke. Hvad kan grunden og løsningen hertil være?
Avatar billede lsskaarup Nybegynder
24. maj 2005 - 09:31 #1
$betingelse i query bliver brugt til når man kun skal se for én projektleder
Avatar billede olleolleolle Nybegynder
24. maj 2005 - 11:35 #2
stripslashes() er ellers en god funktion at bruge.

Test at bruge stripslashes() på $betingelse før $query bliver definieret.

------

En anden ting (som måske er Eksperten.dk-relateret):

if ($_POST['sort'] == projektleder)    {

Er projektleder en string eller er det en konstant?
Avatar billede olleolleolle Nybegynder
24. maj 2005 - 11:36 #3
Vrøvl! Jeg mener:

$sort = stripslashes($sort);

før $query bliver definieret.
Avatar billede olleolleolle Nybegynder
24. maj 2005 - 11:38 #4
Og find dokumentationen frem: http://www.php.net/docs.php

Jeg bruger gerne docs lokalt, når jeg er på Windows er det smartest via en CHM-fil, som kan downloades fra php.net:

http://www.php.net/download-docs.php
Avatar billede lsskaarup Nybegynder
24. maj 2005 - 11:50 #5
Prøver lige med stripslashes. Jeg kan bare ikke forstå, at når jeg ikke sætte dem med den modsatte funktion, at de så kommer på i et enkelt tilfælde pr. side. Dog ved jeg ikke om serveren sætter dem på, men så burde de vel være der hele tiden, ikk'?

Men hensyn til projektleder, så bliver en sat sådan: onClick="return setSort('projektleder');">, så det må vel være en string.
Avatar billede lsskaarup Nybegynder
24. maj 2005 - 11:56 #6
Sådan det ser ud til at virke på mine testfiler. Prøver lige at sætte det i drift, hører du et skrig, så ved du hvorfor. ;-P

Tak for hjælpen.
Avatar billede olleolleolle Nybegynder
24. maj 2005 - 13:06 #7
Well, take this as an answer. Så kan du give mig points hvid du vil.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester