[PDO] meerdere keren zelfde keyword

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 19-09 07:10
Ik heb een (vind ik) vreemd probleem waar ik niet uitkom.. :(

Met behulp van PDO maak ik verbinding met de database. Nu heb ik het volgende stukje code dat geen resultaten geeft:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$searchTerms = "+*breaking* +*bad*";

$query = "SELECT *, 
MATCH (title) AGAINST ('?' IN BOOLEAN MODE) AS title_relevance, 
MATCH (plot) AGAINST ('?' IN BOOLEAN MODE) AS plot_relevance 
FROM titles 
WHERE MATCH (title, plot) AGAINST ('?' IN BOOLEAN MODE) 
ORDER BY title_relevance DESC, plot_relevance DESC, title ASC 
LIMIT 10";

$q = $mysql->prepare($query);
$q->execute(array($searchTerms));


Als ik vervolgens de WHERE clause eruit haal, dus:

WHERE MATCH (title, plot) AGAINST ('?' IN BOOLEAN MODE)

dan geeft de query wel resultaat.. Iemand enig idee waar ik moet zoeken om dit probleem op te lossen? Het maakt verder niet uit of ik een vraagteken gebruik of dat ik met bijv ':searchTerms' => $searchTerms de query uitvoer. Door $searchTerms rechtstreeks (op de plekken van de vraagtekens) in de query te zetten krijg ik wel resultaten (dus ook met de WHERE clause erin), maar dat wil ik uiteraard niet vanwege injectie.

[ Voor 8% gewijzigd door mauricedb op 23-03-2014 21:59 ]


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Geen resultaten, maar wat wel? Is er misschien een foutmelding? Haal die eerst eens tevoorschijn.

Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 19-09 07:10
Nee, geeft geen foutmelding, gewoon nul resultaat (oftewel niets in de database voldoet). Zoals in de eerste post staat doet de query het wel keurig als ik de where clause eruit haal, dat vind ik dus ook het vreemde.

[ Voor 16% gewijzigd door mauricedb op 23-03-2014 23:38 ]


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Vreemd, want er zitten een aantal fouten in je voorbeeldquery, zoals maar 1 parameter meegeven, terwijl je 3 in je query gebruikt, dat zou een foutmelding moeten geven, zowel van PHP als van PDO. Het lijkt me verstandig om uit te zoeken waarom je geen foutmelding ziet, en of je wel heel zeker weet dat je ::errorInfo() gebruikt om foutmeldingen van PDO uit te lezen.

Acties:
  • 0 Henk 'm!

  • HansvDr
  • Registratie: Augustus 2009
  • Niet online
Je wilt 3x dezelfde paramater.

PHP:
1
$q->execute(array($searchTerms, $searchTerms, $searchTerms));


moet het volgens mij wel doen.

Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 19-09 07:10
Ik kan er op dit moment niet mee prutsen, vanavond weer, maar wat jij zegt HansvDr heb ik als 't goed is al geprobeerd. Toen kreeg ik geloof ik ook geen resultaat. Heb trouwens ook al het volgende geprobeerd, waarvan je zou zeggen dat dit gewoon zou moeten werken:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$searchTerms = "+*breaking* +*bad*";

$query = "SELECT *, 
MATCH (title) AGAINST (':title' IN BOOLEAN MODE) AS title_relevance, 
MATCH (plot) AGAINST (':plot' IN BOOLEAN MODE) AS plot_relevance 
FROM titles 
WHERE MATCH (title, plot) AGAINST (':where' IN BOOLEAN MODE) 
ORDER BY title_relevance DESC, plot_relevance DESC, title ASC 
LIMIT 10";

$q = $mysql->prepare($query);
$q->execute(array(':title' => $searchTerms, ':plot' => $searchTerms, ':where' => $searchTerms));


Als 't goed is had ik 'm precies zo, ook geen resultaat. Foutmelding wat _js_ zegt moet ik nog even naar kijken. Als ik bewust de query uitlokte om een foutmelding te genereren (door bijv. aanhalingstekens weg te halen bij :title, toen kreeg ik ook een foutmelding. Dus op dat vlak staat foutmelding wel gewoon aan.

[ Voor 10% gewijzigd door mauricedb op 24-03-2014 14:36 ]


Acties:
  • 0 Henk 'm!

  • Donderpoes
  • Registratie: April 2011
  • Laatst online: 11-05 23:09
Ik dacht dat een dubbele wildcard +*breaking* niet werkt met full text index. De wildcard kan je volgens mij alleen achter je zoekterm plaatsen.

Verder weet ik niet of de wildcard toegevoegd wordt aan je string lengte, want full text index werkt standaard vanaf 4 karakters. bad zou dus genegeerd kunnen worden.

Heb je errorInfo al gedumped?

PHP:
1
var_dump($q->errorInfo(),$mysql->errorInfo());

Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 19-09 07:10
Ik heb wat jullie zeiden geprobeerd, maar 't is helaas nog niet opgelost. Krijg geen foutmelding, ook niet met errorInfo (wel als ik bewust bijvoorbeeld een aanhalingsteken weghaal).

@Donderpoes, of er wel of niet een wildcard voor staat, bij beiden geeft ie geen foutmelding. Met een wilcard ervoor krijg ik resultaten met de query (bij gebruik van meerdere woorden). Als er geen wildcard voor zit en je zoekt op meerdere woorden, dan geeft ie niets.

PHP:
1
2
3
4
5
6
7
8
9
$query = "SELECT *, MATCH (title) AGAINST (':title' IN BOOLEAN MODE) AS title_relevance, 
MATCH (plot) AGAINST (':plot' IN BOOLEAN MODE) AS plot_relevance 
FROM titles 
WHERE MATCH (title, plot) AGAINST ('$searchTerms' IN BOOLEAN MODE) 
ORDER BY title_relevance DESC, plot_relevance DESC, title ASC 
LIMIT 10";
        
$q = $mysql->prepare($query);
$q->execute(array(':title' => $searchTerms, ':plot' => $searchTerms));


Dit werkt wel keurig.

Snelle edit (moet nu weg):
Zo lijkt ie 't te doen :D
PHP:
1
2
3
4
5
6
7
8
$q = $mysql->prepare("SELECT *, 
MATCH (title) AGAINST (:search IN BOOLEAN MODE) AS title_relevance, 
MATCH (plot) AGAINST (:search IN BOOLEAN MODE) AS plot_relevance 
FROM titles 
WHERE MATCH (title, plot) AGAINST (:search IN BOOLEAN MODE) 
ORDER BY title_relevance DESC, plot_relevance DESC, title ASC 
LIMIT 10");
$q->execute(array(':search' => $searchTerms));


Dus zonder aanhalingstekens... straks als ik weer thuis ben verder kijken/testen.

[ Voor 22% gewijzigd door mauricedb op 24-03-2014 20:26 ]


Acties:
  • 0 Henk 'm!

  • PsychoMantis_NL
  • Registratie: Juli 2011
  • Laatst online: 11:58

PsychoMantis_NL

PSN: PsychoMantis_NL

Dat kan wel kloppen, bij prepared statements hoef (of mag?) je de placeholders niet tussen quotes plaatsen zoals je dat bij de "oude" mysql_* syntax wel moest doen, daar is het "preparen" voor ;)
There is a common misconception about how the placeholders in prepared statements work: they are not simply substituted in as (escaped) strings, and the resulting SQL executed. Instead, a DBMS asked to "prepare" a statement comes up with a complete query plan for how it would execute that query, including which tables and indexes it would use, which will be the same regardless of how you fill in the placeholders.
Bron: php.net

[ Voor 9% gewijzigd door PsychoMantis_NL op 26-03-2014 07:56 ]

PsychoMantis_NL @ Battlefield || Red Dead Redemption || GTA V


Acties:
  • 0 Henk 'm!

  • mauricedb
  • Registratie: Maart 2007
  • Laatst online: 19-09 07:10
Geen id hoe het zit. In de meeste query's heb ik gewoon aanhalingstekens staan en dat doet het prima, alleen dus niet in bovenstaande query. Heb 't in ieder geval op kunnen lossen door daar geen aanhalingstekens meer te gebruiken :D
Pagina: 1