WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Mysql - Olika resultat på samma fråga (https://www.wn.se/forum/showthread.php?t=10600)

Patek Philippe 2005-10-30 09:48

Har stött på ett skumt problem. Jag håller på och ändrar ett sökscript och får inte rätt resultat från min selectfråga. När jag ställer samma fråga direkt till databasen får jag de svar jag ska ha.

Så här ser koden ut:

Kod:

$srchSql .= $sortWord;
echo $srchSql;
$rs = new MySQLPagedResultSet($srchSql,20);

På detta får jag en rad tillbaka. Om jag ändrar koden till följande får jag de 29 rader jag ska ha:

Kod:

$srchSql = "Inklistrad fråga från echo $srchSql ovan"
$rs = new MySQLPagedResultSet($srchSql,20);


Hur är detta möjligt? Det är ju exakt samma fråga som skickas till funktionen. Jag har också provat att gå förbi funktionen, men det gör ingen skillnad.

Någon som har råkat ut för detta eller vet vad det kan bero på?

chrizz 2005-10-30 11:06

Använder du mysqls fulltext search eller? Isåfall kan det bero på att ditt fulltext index inte är som det ska. Prova reparera tabellen "REPAIR TABLE asdf", eller helt enkelt droppa indexet och skapa det igen. Jag är osäker om repair table gör något åt indexet, men en drop nollställer garanterat och det byggs upp igen sen.

Patek Philippe 2005-10-30 13:22

Citat:

Originally posted by chrizz@Oct 30 2005, 12:06
Använder du mysqls fulltext search eller? Isåfall kan det bero på att ditt fulltext index inte är som det ska. Prova reparera tabellen REPAIR TABLE asdf, eller helt enkelt droppa indexet och skapa det igen. Jag är osäker om repair table gör något åt indexet, men en drop nollställer garanterat och det byggs upp igen sen.


Nope, inget fulltextindex. Det är en InnoDb tabell.

Gustaf 2005-10-30 13:49

jag förstår inte riktigt koden du skriver. Sänder du strängen

Citat:

$srchSql = "Inklistrad fråga från echo $srchSql ovan"
$rs = new MySQLPagedResultSet($srchSql,20);

eller? vad menar du med "inklistrad fråga"?

Patek Philippe 2005-10-30 14:27

MySQLPagedResultSet är en pagingfunktion, själva anropet till databasen sker där, men problemet ligger inte där, jag har provat att gå förbi den. Det jag menar med inklistrad fråga är att jag i stället för att plocka fram SELECT satsen utiftrån mitt formulär skriver jag in den manuellt. Jag tar då frågan jag får från echot och klistrar in den enligt koden ovan, bara för att kontrollera, det konstiga är att då fungerar det...

Jonas 2005-10-30 15:51

Vill du ha hjälp ordentligt så får du snällt skicka med classen och själva SQL-frågan också.

Tror du vi är synska och skall förstå exakt vad din class gör eller?

Så här mycket förstår jag:

Kod:

$srchSql .= $sortWord;
Okej, han kontaninera han ihop variablarna $srchSql och $sortWord
Kod:

echo $srchSql;
Skriver ut värdet i $srchSql
Kod:

$rs = new MySQLPagedResultSet($srchSql,20);
Kallar klassen MySQLPagedResultSet och tar emot resultatet i $rs

Men vad innehåller då $srchSql och $sortWord ?
Vad gör klassen MySQLPagedResultSet ?


Citat:

Originally posted by Patek Philippe@Oct 30 2005, 15:27
MySQLPagedResultSet är en pagingfunktion, själva anropet till databasen sker där, men problemet ligger inte där, jag har provat att gå förbi den.
Det är ingen funktion. Det är en KLASS.

Patek Philippe 2005-10-30 17:21

Ja, det är klart att det är en klass. Syftade på funktionen med samma namn i klassen. My bad. Klassen är dock rätt ointressant eftersom jag som sagt provat att gå förbi den med samma resultat.

$srchSql innehåller följande: SELECT l.legal_case_id, l.header, l.body, l.publish_date, l.summary, lt.name, lt.legal_case_type_id, la.name, la.legal_area_id FROM legal_case l, legal_case_type lt, legal_area la WHERE l.legal_case_type_id = lt.legal_case_type_id AND l.legal_area_id = la.legal_area_id AND (l.body LIKE '% sökord%' OR l.summary LIKE '% sökord%') ORDER BY l.publish_date DESC

Denna fungerar alltså precis som den ska när jag kör den direkt mot databasen, alternativt klipper in den från echot enligt mitt första exempel.

guran 2005-10-30 17:44

När du skrivar att har provat att gå förbi klassen har du då kört frågan på detta sätt?

$rs = mysql_query($srchSql);

För mig låter det som om det är något som händer i klassen. Prova att stoppa in echo i klassen för att se hur frågan ser ut i klassen precis innan den körs där.

Patek Philippe 2005-10-30 17:51

Citat:

När du skrivar att har provat att gå förbi klassen har du då kört frågan på detta sätt?

$rs = mysql_query($srchSql);

För mig låter det som om det är något som händer i klassen. Prova att stoppa in echo i klassen för att se hur frågan ser ut i klassen precis innan den körs där.

Jajamen, tycker därför att jag kan utesluta att problemet skulle ligga där.

guran 2005-10-30 17:56

Vad avses med 20 i MySQLPagedResultSet($srchSql,20)?

Jonas 2005-10-30 18:26

Citat:

Originally posted by Patek Philippe@Oct 30 2005, 18:21
Ja, det är klart att det är en klass. Syftade på funktionen med samma namn i klassen.
Det är ingen funktion. Det är en metod ;)

DeSoto 2005-10-30 18:29

Citat:

Originally posted by guran@Oct 30 2005, 18:56
Vad avses med 20 i MySQLPagedResultSet(srchSql,20)?

Med största sannolikhet hur många poster som ska visas per sida.

Patek Philippe 2005-10-30 18:49

Citat:

Citat:

Vad avses med 20 i MySQLPagedResultSet(srchSql,20)?
Med största sannolikhet hur många poster som ska visas per sida.

Exakt.

Citat:

Det är ingen funktion. Det är en metod
Kanske det, spelar det någon större roll? Du har inte någon idé om vad som kan vara problem i stället?

guran 2005-10-30 21:53

Har du möjlighet att sätta in koden exakt på hur $srchSql och $sortWord ser ut?

Patek Philippe 2005-10-30 22:31

Citat:

Originally posted by guran@Oct 30 2005, 22:53
Har du möjlighet att sätta in koden exakt på hur srchSql och sortWord ser ut?

Visst, så här ser det ut.

Kod:

$srchSql = "SELECT l.legal_case_id, l.header, l.body, l.publish_date, l.summary, lt.name, lt.legal_case_type_id, la.name, la.legal_area_id FROM legal_case l, legal_case_type lt, legal_area la";
$srchSql .= " WHERE l.legal_case_type_id = lt.legal_case_type_id AND l.legal_area_id = la.legal_area_id ";

$ors = 0;
$sortLink = "";

if ($_REQUEST["legal_case_type1"] != '') {
        if($ors == 0) {
 $srchSql .= " AND (";       
        } else {
 $srchSql .= " OR ";
        }
        $srchSql .= "l.legal_case_type_id = 1";
        $ors++;
        $sortLink .= '&legal_case_type1=1';
}
if ($_REQUEST["legal_case_type2"] != '') {
        if($ors == 0) {
 $srchSql .= " AND (";       
        } else {
 $srchSql .= " OR ";
        }
        $srchSql .= "l.legal_case_type_id = 2";
        $ors++;
        $sortLink .= '&legal_case_type2=2';
}
if ($_REQUEST["legal_case_type3"] != '') {
        if($ors == 0) {
 $srchSql .= " AND (";       
        } else {
 $srchSql .= " OR ";
        }
        $srchSql .= "l.legal_case_type_id = 3";
        $ors++;
        $sortLink .= '&legal_case_type3=3';
}
if ($_REQUEST["legal_case_type4"] != '') {
        if($ors == 0) {
 $srchSql .= " AND (";       
        } else {
 $srchSql .= " OR ";
        }
        $srchSql .= "l.legal_case_type_id = 4";
        $ors++;
        $sortLink .= '&legal_case_type4=4';
}
if ($_REQUEST["legal_case_type5"] != '') {
        if($ors == 0) {
 $srchSql .= " AND (";       
        } else {
 $srchSql .= " OR ";
        }
        $srchSql .= "l.legal_case_type_id = 5";
        $ors++;
        $sortLink .= '&legal_case_type5=5';
}
if ($_REQUEST["legal_case_type6"] != '') {
        if($ors == 0) {
 $srchSql .= " AND (";       
        } else {
 $srchSql .= " OR ";
        }
        $srchSql .= "l.legal_case_type_id = 6";
        $ors++;
        $sortLink .= '&legal_case_type6=6';
}
if ($_REQUEST["legal_case_type7"] != '') {
        if($ors == 0) {
 $srchSql .= " AND (";       
        } else {
 $srchSql .= " OR ";
        }
        $srchSql .= "l.legal_case_type_id = 7";
        $ors++;
        $sortLink .= '&legal_case_type7=7';
}

if($ors > 0) {
        $srchSql .= ")";       
}


if($_REQUEST['publish_date'] == 'last_3_days'){
        $srchSql .= " AND l.publish_date >= DATE_SUB(CURDATE(),INTERVAL 3 DAY)";       
        $sortLink .= '&publish_date=last_3_days';
} else if($_REQUEST['publish_date'] == 'last_week'){
        $srchSql .= " AND l.publish_date >= DATE_SUB(CURDATE(),INTERVAL 7 DAY)";       
        $sortLink .= '&publish_date=last_3_days';
} else if($_REQUEST['publish_date'] == 'last_month'){
        $srchSql .= " AND l.publish_date >= DATE_SUB(CURDATE(),INTERVAL 30 DAY)";       
        $sortLink .= '&publish_date=last_month';
}

if($_REQUEST['legal_area'] != ''){
  $srchSql .= " AND l.legal_area_id = " . $_REQUEST['legal_area'];
  $sortLink .= '&legal_area=' . $_REQUEST['legal_area'];
}

if($_REQUEST['header'] != ''){
  $srchSql .= " AND l.header LIKE '%" . $_REQUEST['header'] . "%' ";
  $sortLink .= '&header=' . $_REQUEST['header'];
}

if($_REQUEST['bodytext'] != ''){
        $keyword = makeboolean("l.body",$_REQUEST['bodytext']);
        $keyword2 = makeboolean("l.summary",$_REQUEST['bodytext']);
       
 
        $srchSql .= " AND (" . $keyword;
        $srchSql .= " OR " . $keyword2 . ") ";
        $sortLink .= '&bodytext=' . $_REQUEST['bodytext'];
}

$srchSql .= $sortWord;


echo $srchSql;

//$srchSql = "SELECT l.legal_case_id, l.header, l.body, l.publish_date, summary, lt.name legal_casetype, la.name legal_area FROM legal_case l, legal_case_type lt, legal_area la WHERE l.legal_case_type_id = lt.legal_case_type_id AND l.legal_area_id = la.legal_area_id AND (l.body LIKE '% sökord%' OR summary LIKE '% sökord%') ORDER BY l.publish_date DESC";


$rs = new MySQLPagedResultSet($srchSql,20);

EDIT: Missade de sista raderna. Om jag byter till den bortkommenterade raden fungerar det alltså.

Funktionen makeboolean: (Nej, jag kan inte använda fulltextindesk med boolean mode i stället)

Kod:

/***********************************************************/
function makeboolean($sqlfieldname, $keywordstr) {
// pass into this function the sqlfieldname that you want to search by and the original string
// that the user entered into the form field on the search engine.
// After you get back the result from this function, include it into your complete search string.
// Note, you may want to call this function repeatedly to search through various fields in your
// tables.

$keyword = $keywordstr;

// Convert String To Lower Case
 $keyword = strtolower($keyword);

// Replace Word Operators With Single Character Operators
 $keyword = ereg_replace(" and ","+",$keyword);
 $keyword = ereg_replace(" or ","|",$keyword);
 $keyword = ereg_replace(" not ","-",$keyword);


// Build The Keywords String Based On Operators Assigned Above
 $operatorcount = 0;
 $len = strlen($keyword);
 for ($z = 0; $z < $len; $z++) {
 if(($keyword[$z] == "+") || ($keyword[$z] == "|") || ($keyword[$z] == "-")) {
  $operatorpos[$operatorcount] = $z;
  $operatorcount++;
 }
 }

 if ($operatorcount != 0) {
  for ($z = 0; $z < $operatorcount; $z++) {
  if($z == 0) {
    $startpos = 0;
    $endpos = $operatorpos[$z];
  } else {
    $startpos = $operatorpos[$z - 1] + 1;
    $endpos = $operatorpos[$z];
  }
 
  $word = $endpos - $startpos;
  $keystring = substr($keyword,$startpos,$word);
  $keystring = ereg_replace("\(","",$keystring);
  $keystring = ereg_replace("\)","",$keystring);
  $keywords[$z] = $keystring;
  $operator_pos = $operatorpos[$z];
  $operators[$z] = $keyword[$operator_pos];
  } // end the for loop

 $wordcount = $operatorcount + 1;
 $startpos = $operatorpos[$z - 1] + 1;
 $len2 = strlen($keyword) - $startpos;
 $linestr = substr($keyword,$startpos,$len2);

 //store the line into the keywords array
 $keywords[$wordcount - 1] = $linestr;


 //loop through all of the words in the words array replacing them in the original string with a
//LIKE clause
 for ($z=0; $z < $wordcount; $z++) {
  $replacekeyword = $keywords[$z];
  $y = $z -1;
  if ($operators[$y] != "-")  //odd case is in a NOT...must do something different!
  $keyword = ereg_replace($replacekeyword,"$sqlfieldname LIKE '%$replacekeyword%'",$keyword);
  else
  $keyword = ereg_replace($replacekeyword,"$sqlfieldname NOT LIKE '%$replacekeyword%'",$keyword);
 }

// Replace Our Operators With The Correct SQL Operators
 $keyword = ereg_replace("\+"," AND ", $keyword);
 $keyword = ereg_replace("\|"," OR ", $keyword);
 $keyword = ereg_replace("\-"," AND ", $keyword); //I fudged in the above statement so this possible :-)

} // end if operatorcount != 0
else { //there were no operators in the string
  $replacekeyword = $keyword;
 if ($keyword != "") {
  $keyword = ereg_replace($replacekeyword,"$sqlfieldname LIKE '%
$replacekeyword%'",$keyword);
 }
}
 
 return($keyword);

} //end the makebooleanstatement function

///////////////////////////////////////////////////////////////


hnn 2005-10-31 00:32

Citat:

Ursprungligen postat av Jonas
Citat:

Ursprungligen postat av Patek Philippe
Ja, det är klart att det är en klass. Syftade på funktionen med samma namn i klassen.


Det är ingen funktion. Det är en metod ;)

Nej, Det är en klass... =)

Patek Philippe 2005-10-31 21:11

Ingen som har någon idé?

guran 2005-11-01 11:10

Det är väldigt mysko det hela och jag måste säga att jag kan inte komma på vad det kan vara för fel.

Patek Philippe 2005-11-01 13:34

Citat:

Originally posted by guran@Nov 1 2005, 12:10
Det är väldigt mysko det hela och jag måste säga att jag kan inte komma på vad det kan vara för fel.

Kan säga att jag börjar bli kal på skallen av allt kliande...

Märkte dock att det fungerar om jag skippar makeboolean-funktionen och byter ut
Kod:

if($_REQUEST['bodytext'] != ''){
$keyword = makeboolean("l.body",$_REQUEST['bodytext']);
$keyword2 = makeboolean("l.summary",$_REQUEST['bodytext']);

 
$srchSql .= " AND (" . $keyword;
$srchSql .= " OR " . $keyword2 . ") ";
$sortLink .= '&bodytext=' . $_REQUEST['bodytext'];
}

mot
Kod:

if($_REQUEST['bodytext'] != ''){
  $srchSql .= " AND (l.body LIKE '%" . $_REQUEST['bodytext'] . "%' ";
        $srchSql .= " OR summary LIKE '%" . $_REQUEST['bodytext'] . "%') ";
  $sortLink .= '&bodytext=' . $_REQUEST['bodytext'];
}

Men så vill jag ju inte ha det...


Alla tider är GMT +2. Klockan är nu 03:51.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson