query new conexion php mysql pdo

new - php mysql connect



DeclaraciĆ³n preparada de PHP PDO-Consulta LIKE de MySQL (3)

Estoy tratando de hacer una búsqueda a través de la clase PDO de php (driver mysql). Tengo la siguiente consulta trabajando con el cliente MySQL (los nombres de las tablas han cambiado para proteger a los inocentes):

SELECT hs.hs_pk, hs.hs_text, hs.hs_did, hd.hd_did, hd.hd_text, hv.hv_text, hc.hc_text FROM hs LEFT JOIN hd ON hs.hs_did = hd.hd_did LEFT JOIN hd ON hd.hd_vid = hv.hv_id LEFT JOIN hc ON hd.hd_pclass = hc.hc_id WHERE hs.hs_text LIKE "%searchTerm%" LIMIT 25;

Esto funciona como un encanto sin importar el término de búsqueda que uso. Sin embargo, cuando me muevo a php, no puedo hacer que devuelva nada. He intentado varias sintaxis diferentes que parecen lógicas para trabajar, pero nada de lo que he intentado funciona. aquí está mi código existente:

$handle = fopen(''/foo/bar/test.log'', ''w+''); fwrite($handle, "doSearch, with search term: $searchTerm/n"); $sql = ''SELECT hs.hs_pk, hs.hs_text, hs.hs_did, hd.hd_did, hd.hd_text, hv.hv_text, hc.hc_text FROM hs LEFT JOIN hd ON hs.hs_did = hd.hd_did LEFT JOIN hd ON hd.hd_vid = hv.hv_id LEFT JOIN hc ON hd.hd_pclass = hc.hc_id WHERE hs.hs_text LIKE :searchTerm LIMIT 25''; try { $dbh = new PDO(''mysql:host=localhost;dbname=awdb'', "user", "password"); fwrite($handle, "connected to DB/n"); $prep = $dbh->prepare($sql); $ret = $prep->execute(array('':searchTerm'' => ''"%''.$searchTerm.''%"'')); while ($row = $prep->fetch(PDO::FETCH_ASSOC)) { $i++; $result[$i][''subText''] = $row[''hs_pk'']; $result[$i][''subText''] = $row[''hs_text'']; $result[$i][''subDid''] = $row[''hs_did'']; $result[$i][''devDid''] = $row[''hd_did'']; $result[$i][''devText''] = $row[''hd_text'']; $result[$i][''vendorText''] = $row[''hv_text'']; $result[$i][''classText''] = $row[''hc_text'']; } $dbh = null; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "<br/>"; die(); }

También intenté lo siguiente (las cláusulas SQL WHERE y prep-> ejecutar líneas son todo eso):

WHERE hs.hs_text LIKE CONCAT(/'%/', ?, /'%/') $ret = $prep->execute(array($searchTerm)); WHERE hs.hs_text LIKE "%:searchTerm%" $ret = $prep->execute(array('':searchTerm'' => $searchTerm)); WHERE hs.hs_text LIKE ":searchTerm" $ret = $prep->execute(array('':searchTerm'' => ''%''.$searchTerm.''%''));

etc ...


Bueno, he resuelto este. Y francamente, soy un idiota ... Gracias a todos por ver esto y dar buenos comentarios. El problema era un error tipográfico en el nombre de una tabla (que cambié, por lo que nadie aquí podría ver mi problema, para empezar ...). Las sugerencias me llevaron a encontrar el problema, así que gracias adam, jkndrkn y troelskn.

Para el registro, la siguiente combinación funciona bien:

WHERE aw_hcl_subdevices.hs_text LIKE CONCAT(/'%/', ?, /'%/') $ret = $prep->execute(array($searchTerm));


$prep = $dbh->prepare($sql); $ret = $prep->execute(array(''searchTerm'' => $searchTerm));


$ret = $prep->execute(array('':searchTerm'' => ''"%''.$searchTerm.''%"''));

Esto está mal. No necesitas las comillas dobles.

WHERE hs.hs_text LIKE ":searchTerm" $ret = $prep->execute(array('':searchTerm'' => ''%''.$searchTerm.''%''));

Esto también está mal. Prueba con:

$prep = $dbh->prepare($sql); $ret = $prep->execute(array('':searchTerm'' => ''%''.$searchTerm.''%''));

Explicación: las declaraciones preparadas no hacen simplemente una cadena de reemplazo. Transportan los datos completamente separados de la consulta. Las cotizaciones solo son necesarias cuando se incrustan valores en una consulta.