Avatar billede nicklasw Nybegynder
01. april 2011 - 19:25 Der er 18 kommentarer og
1 løsning

returner rows selvom den ikke burde

Hejsa.
Kode neden under er et php script som bliver kaldt via et ajax script.
Det den skal (og gør) er at returnere nogle rows via et json objekt. Den tjekke om der blevet givet et søge kritere, hvis der er blive dette tilføjet til mssql stringen.

Derudover sender den kun 100 af gangen. det er fordi der er en knap på hjemmesiden der hedder "hent de 100 næste". Dette virker også fint nok. men hvis man søger og den sender fx. 13 rows tilabge der opfylder søge kriterene og man så trykker på hent 100 næste, så henter de samme rows igen (dette burde den ikke gøre), den burde bare sende et tomt json objekt tilbage.

Dog hvis man ikke søger og man trykker på "hent 100 næste" nok gange således man når til enden af tabellen, så sender den et tomt json objekt tilbage (som den burde). Det er bare for at understrege at problemet er der kun når man søger.

koden:
$sqlString = "SELECT TOP 100 * FROM ";
    $page = $_POST["page"]*100;
    $search = $_POST["search"];
    $search = utf8_decode($search);
    $search = str_replace("'","''", $search);
    $sqlSearch;
    $sqlSearchNext;

   
    switch($_POST["data"])
    {
        case "customer":
            if(!empty($search))
            {
                $sqlSearch = " id LIKE '$search%' OR customer_name LIKE '$search%' OR customer_roadname LIKE '%$search%' OR customer_city LIKE '$search%' AND";
                $sqlSearchNext = " WHERE id LIKE '$search%' OR customer_name LIKE '$search%' OR customer_roadname LIKE '%$search%' OR customer_city LIKE '$search%'";
            }
            $sqlString .= "cust_customer WHERE$sqlSearch id NOT IN(SELECT TOP $page id FROM cust_customer$sqlSearchNext ORDER BY id) ORDER BY id";
           
            $q = mssql_query($sqlString, $con);
           
            if(mssql_num_rows($q) == 0)
            {
                exit;
            }
   
            $array;
           
            while($row = mssql_fetch_array($q))
            {
                $tempArray;
               
               
                $tempArray[] = utf8_encode($row["id"]);
                $tempArray[] = utf8_encode($row["customer_name"]);
                $tempArray[] = utf8_encode($row["customer_roadname"] . " " . $row["customer_housenumber"]);
                $tempArray[] = utf8_encode($row["customer_postalcode"]);
                $tempArray[] = utf8_encode($row["customer_city"]);
                $tempArray[] = utf8_encode($row["customer_telephone"]);
               
                $array[] = $tempArray;
                unset($tempArray);
            }
            $json = json_encode($array);
           
            break;
    }
   
    echo $json;


Håber i kan hjælpe mig for jeg kan simpelthen ikke forstå hvorfor det ikke virker som det skal.
Avatar billede nicklasw Nybegynder
01. april 2011 - 19:27 #1
Og selvfølgelig tak på forhånd
Avatar billede olebole Juniormester
01. april 2011 - 20:02 #2
<ole>

For det første mangler du vist nogle mellemrum i denne streng:

$sqlString .= "cust_customer WHERE$sqlSearch id NOT IN(SELECT TOP $page id FROM cust_customer$sqlSearchNext ORDER BY id) ORDER BY id";


Dernæst bør du nok prøve at udskrive $page, $search og $_POST["data"] til en logfil på serveren, så du kan se, hvad de indeholder i forskellige situationer

/mvh
</bole>
Avatar billede olebole Juniormester
01. april 2011 - 20:07 #3
Denne kode kan logge de tre variabler ved at skrive hvert kald til loggen i en ny linje:


$sToWrite = "page: ".$page." :: search: ".$search." :: data: ".$_POST["data"]."\r\n";

$fp = fopen("log.txt", "a");
fwrite($fp, $sToWrite);
fclose($fp);

Avatar billede nicklasw Nybegynder
01. april 2011 - 20:13 #4
nej mangler ikke mellemrum. De er i sql string som evt. bliver tilføjet.

$_POST["data"] indholer "customer" ellers vil funktionen slet ikke blive kørt, og det gør den ;) .

$page bliver også har også den rigtige værdi, den bliver plusset med en for hver gang der trykkes på "hent 100 næste". $search inderholder søgeordet.

Jeg har prøvet at skrive sql stringen ud som blive eksikveret. Den ser ud som den er tiltænkt i de forskellige situtationer. Den er gør bare ikke som tiltænkt.
Avatar billede nicklasw Nybegynder
01. april 2011 - 20:23 #5
de her returnere alle det samme. Selvom de to sidste ikke burde returnere noget:


SELECT TOP 100 * FROM cust_customer WHERE id LIKE 'brian%' OR customer_name LIKE 'brian%' OR customer_roadname LIKE '%brian%' OR customer_city LIKE 'brian%' AND id NOT IN(SELECT TOP 0 id FROM cust_customer WHERE id LIKE 'brian%' OR customer_name LIKE 'brian%' OR customer_roadname LIKE '%brian%' OR customer_city LIKE 'brian%' ORDER BY id) ORDER BY id



SELECT TOP 100 * FROM cust_customer WHERE id LIKE 'brian%' OR customer_name LIKE 'brian%' OR customer_roadname LIKE '%brian%' OR customer_city LIKE 'brian%' AND id NOT IN(SELECT TOP 100 id FROM cust_customer WHERE id LIKE 'brian%' OR customer_name LIKE 'brian%' OR customer_roadname LIKE '%brian%' OR customer_city LIKE 'brian%' ORDER BY id) ORDER BY id



SELECT TOP 100 * FROM cust_customer WHERE id LIKE 'brian%' OR customer_name LIKE 'brian%' OR customer_roadname LIKE '%brian%' OR customer_city LIKE 'brian%' AND id NOT IN(SELECT TOP 200 id FROM cust_customer WHERE id LIKE 'brian%' OR customer_name LIKE 'brian%' OR customer_roadname LIKE '%brian%' OR customer_city LIKE 'brian%' ORDER BY id) ORDER BY id
Avatar billede olebole Juniormester
01. april 2011 - 20:25 #6
Hvis $sqlString ser ud, som du forventer, må du forklare, hvad det er, du forventer - for så har jeg vist ikke fantasi til at foretsille mig dine forventninger
Avatar billede nicklasw Nybegynder
01. april 2011 - 20:31 #7
De ser ud som jeg har postet der (der er 3 stk.). De to sidste burde ikke returnere nogle rows fordi der er kun omkring 20 rows der opfylder LIKE kriterene (i dette tilfælde brian).

Dog retunere de alle samme de 20 rows som der er.

forstår du? ellers skal jeg nok prøve at forklare det bedre
Avatar billede olebole Juniormester
01. april 2011 - 20:33 #8
"$search inderholder søgeordet." >> Er det noget, du tror, eller er det noget, du ved, fordi du har skrevet den ud på serveren?

Er du f.eks. sikker på denne betingelse opfyldes (betyder: har du testet - og hvordan?):

    if(!empty($search))
Avatar billede olebole Juniormester
01. april 2011 - 20:35 #9
#7 >> Prøv nu lige engang at kikke på den streng, jeg har kopieret efter din i spørgsmålet. Der mangler mellemrum - og det gør der ikke i de tre strenge, du lige har pasted ind. Der er noget, der ikke stemmer
Avatar billede olebole Juniormester
01. april 2011 - 20:37 #10
Den streng, du skriver efter empty-betingelsen kommer tydeligvis aldrig i spil. Det er nok fordi $search aldrig er tom  *o)
Avatar billede olebole Juniormester
01. april 2011 - 20:41 #11
Vrøvl, det er mig, der overså det indledende mellemrum i de to først strenge  :D
Avatar billede Slettet bruger
02. april 2011 - 02:06 #12
Ja, dér er MySQL's LIMIT sgu noget enklere : )

Men bør det ikke være i denne retning (lettere forkortet udvælgelse)

Side 1:
SELECT TOP 100 * FROM cust_customer WHERE id='brian' ORDER BY id

Side 2:
SELECT TOP 200 * FROM cust_customer WHERE id='brian' AND id NOT
    IN(SELECT TOP 100 id FROM cust_customer WHERE id='brian' ORDER BY id) ORDER BY id

Side3:
SELECT TOP 300 * FROM cust_customer WHERE id='brian' AND id NOT
    IN(SELECT TOP 200 id FROM cust_customer WHERE id='brian' ORDER BY id) ORDER BY id

Se evt: http://vorg.ca/626-the-MS-SQL-equivalent-to-MySQLs-limit-command
Avatar billede nicklasw Nybegynder
02. april 2011 - 10:35 #13
Joo empty betegnelse gør som den skal. Jeg har bare ikke pastet sql string fra når jeg laver en "tom" søgning...

Jeg svare på dine "tjek" spørgsmål senere
Avatar billede nicklasw Nybegynder
02. april 2011 - 10:38 #14
Hej tom. Neej, fordi den skal ikke sende de rows som jeg allerede har fået sendt. Det jeg prøver er noget lig med LIMIT 100, 100 plus evt søgning
Avatar billede nicklasw Nybegynder
02. april 2011 - 10:39 #15
Drop lige min sidste kommentar
Avatar billede nicklasw Nybegynder
02. april 2011 - 10:42 #16
Hej tom. det er jo ca også det jeg gør, men skal bare også have en søgning med. Og det er jo lidt der problemet opstår
Avatar billede nicklasw Nybegynder
01. maj 2011 - 08:46 #17
Da jeg ikke har fået løst mit problem vil jeg lukke spørgsmålet... Men jeg vil gerne give point til dem der har brugt tid på at hjælpe... Jeg venter 2 dage...
Avatar billede Slettet bruger
01. maj 2011 - 10:56 #18
No cure, no pay!

Kan du ikke forsimple udtrykket (til ren bladring), og få dét til at virke
- og derefter begynde at fylde "komplikationer" på...
Avatar billede nicklasw Nybegynder
15. juni 2011 - 08:48 #19
Da det blev løst med et meget custom wien around, vil jeg bare lukke spørgsmålet
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