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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top