Error de consulta SQL LIKE - error fatal en una declaración preparada
Pregunta
Tengo el siguiente código:
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Que debería funcionar bien. Sin embargo recibo el error de que:
Tienes un error en tu sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para conocer la sintaxis correcta para usar cerca de '? DONDE la parte superior (ARTICLE_NAME) ME GUSTA '%?%' 'En la línea 1
Si pongo
SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '% o %';
La consulta funciona bien. $ table se define arriba, y la consulta se recibe de GET, y ambos son valores válidos correctos. ¿Por qué está fallando esto?
editar: cambiando a:
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
da como resultado el error:
Advertencia: mysqli_stmt :: bind_param () [mysqli-stmt.bind-param]: el número de variables no coincide con el número de parámetros en la declaración preparada en C: \ Archivos de programa \ EasyPHP 3.0 \ www \ prog \ get_records. php en la línea 38
Comandos desincronizados; no puedes ejecutar este comando ahora
donde as
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
resultados en
Error grave: no se puede pasar el parámetro 2 por referencia en C: \ Archivos de programa \ EasyPHP 3.0 \ www \ prog \ get_records.php en la línea 38
y por último
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ? ";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $query);
dará solo:
Comandos desincronizados; no puedes ejecutar este comando ahora
¿Es imposible usar un parámetro para un estado LIKE?
Solución
Para la cláusula LIKE
, use esto:
SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ?, '%')
En cuanto al nombre de la tabla, es una muy mala práctica tener nombres de tabla como parámetros.
Si, por algún motivo, aún necesitas hacerlo, deberás insertarlo en el texto de la consulta antes de preparar la consulta:
$countQuery = "SELECT ARTICLE_NO FROM $table_name WHERE upper(ARTICLE_NAME) LIKE CONCAT('%', ? ,'%')";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Otros consejos
Has emitido
mysqli_free_result($result);
después de la última consulta? Ese es el comando fuera de error de sincronización.
Esto debería funcionar sin embargo
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS1 WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", "%".$query."%");
Se pregunta qué hay en la variable $ query. Intenta hacer esto en su lugar
$query = '%'.$query.'%';
$numRecords->bind_param("s", $query);
Prueba lo siguiente:
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE ?";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("ss", $table, "%$brand%");
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = mysql_num_rows($data);
$rows = getRowsByArticleSearch($query, $table, $max);
$last = ceil($rowcount/$page_rows);
}
Afaik, no puede usar marcadores de posición para identificadores con mysqli y preparar declaraciones. Así que tendrías que interpolar manualmente el nombre de la tabla en la consulta.