2012-12-03 20 views
7

Sto convertendo tutto il codice dei miei siti dall'utilizzo delle funzioni mysql_ * a PDO. La documentazione PHP su PDO non è chiara per le mie esigenze. Ti dà le funzioni da usare, ma non entra nei dettagli per spiegarle in diversi scenari.PDO e MySQL Ricerche di testo completo

Fondamentalmente, ho una ricerca full-text di MySQL:

$sql = "SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST ('{$searchFor}*' IN BOOLEAN MODE)"; 

Il bilancio attuale molto più a lungo, ma questo è ciò che fa in fondo.

La mia domanda è, come inserirò questo in PDO?

So che non si intende utilizzare le virgolette intorno al segnaposto, quindi li si lascia fuori nella funzione AGAINST()? Li includo? Se li lascio fuori, cosa succede al simbolo jolly ecc?

$sql = $this->db->prepare("SELECT ... FROM search_table WHERE MATCH(some_field) AGAINST(:searchText IN BOOLEAN MODE"); 
$sql->bindValue(':searchText', $searchFor . '*'); 

risposta

12

Questo è, purtroppo, un'eccezione strano per l'utilizzo di parametri di query (edit: ma a quanto pare non nella più recente punto di rilascio di ogni ramo MySQL, vedi sotto).

Il modello in AGAINST()deve essere essere una stringa costante, non un parametro di query. A differenza di altre stringhe costanti nelle query SQL, non è possibile utilizzare qui un parametro di query, semplicemente a causa di una limitazione in MySQL.

Per interpolare in modo sicuro modelli di ricerca in query, utilizzare la funzione PDO::quote(). Notare che la funzione quote() di PDO aggiunge già i delimitatori delle virgolette (diversamente da mysql_real_escape_string()).

$quoted_search_text = $this->db->quote('+word +word'); 

$sql = $this->db->prepare("SELECT ... FROM search_table 
    WHERE MATCH(some_field) AGAINST($quoted_search_text IN BOOLEAN MODE"); 

Re commento da @YourCommonSense:

Hai ragione, ho appena testato questo su MySQL 5.5.31, 5.1.68, 5.0.96 e (MySQL Sandbox è uno strumento meraviglioso) e sembra che queste versioni accettino i parametri di query nella clausola AGAINST() di una query SQL dinamica.

Ho ancora un ricordo di un conflitto esistente in passato. Forse è stato corretto nel più recente point-release di ogni ramo. Per esempio, ho trovato questi bug correlati:

+0

la ringrazio molto per la risposta, e la soluzione alternativa :) –

+2

non riesco a riprodurre questo comportamento "strano" si sta parlando. 'CONTRO (? IN MODALITÀ BOOLEANO)' funziona a dovere per me. Quale versione di Mysql stai usando? –

+0

Naturalmente la modalità di emulazione è disattivata e ricontrollata. –

0
$sql = "SELECT * FROM tablename WHERE MATCH (fieldname) AGAINST (:searchstr IN BOOLEAN MODE) LIMIT {$per_page} OFFSET {$pg_offset}"; 

try { 
    $database->prepare($sql); 
    $database->bindParam(':searchstr', $search); 
    $database->execute(); 
    $result_array = $database->fetch_array($sql); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
Problemi correlati