Pregunta

Perdóname por la posibilidad de la estupidez de esta pregunta, pero acabo de empezar a usar declaraciones preparadas. Sé que esta consulta en particular funciona, ya que la probé con métodos de procedimiento no preparados. Aquí está:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($content);
$stmt->fetch();
echo  $content;
$stmt->close();

¡Cualquier consejo o punto en la dirección correcta es muy apreciado!

EDITAR 1: Solo una actualización de mi progreso mientras trato de solucionar problemas. Me di cuenta de que, dado que tengo una columna de identificación como índice en la tabla de secciones, también necesitaba vincular eso como resultado, dada la declaración anterior en php.net, (gracias de nuevo, Bill).

Aquí está el nuevo código:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($id, $name, $content);
$stmt->fetch();
echo $content;
$stmt->close();

Gracias nuevamente a todos los que pueden ofrecer sugerencias. (Tengo curiosidad: me resulta difícil depurar cuando se utiliza el estilo OOP de declaraciones preparadas de esta manera. ¿Existe, por ejemplo, una manera fácil de ver simplemente la consulta que realmente se usó?)

EDITAR 2: Hola, y gracias por hacer esa prueba, realmente lo aprecio. Entiendo la pregunta que te has visto obligado a hacer, ya que también me he sacudido el cerebro por un buen rato. Tengo que decir que existe.

Si hago lo siguiente, solo como un ejemplo rápido y sucio:

$name = 'introduction';
@mysql_connect('host', 'user', 'pass');
@mysql_select_db('db');
$query = "SELECT name,content FROM sections WHERE name = '$name'";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_object($result)) {
    $content = $row->content;
    echo $content;
}

Mis datos aparecen y todo está bien. Sin embargo, si hago lo siguiente:

$name = 'introduction';
$mysqli = new mysqli('localhost', 'user', 'pass', 'db') or die('There was a problem connecting to the database.');
$stmt = $mysqli->prepare("SELECT name, content FROM sections WHERE name = ?");
$stmt->bind_param('s', $name);
$stmt->execute();
$stmt->bind_result($name, $content);
$stmt->fetch();
echo  $content;
$stmt->close();

Lo cual creo que es correcto (siéntete libre de gritar si no, por supuesto), no obtengo nada. Además, con ese código, cuando hago una validación html (por si acaso), recibo una advertencia interna del servidor (500), que considero un problema con el código sql. ¿Estoy loco?

¡Gracias por su continua ayuda, es muy apreciada!

EDITAR 3: Bueno, me siento como un idiota, pero lo arreglé y Bill, tu pregunta fue correcta. No sé cómo demonios logré poner detalles incorrectos de la base de datos y extrañarlos durante tanto tiempo, pero eso es precisamente lo que sucedió.

Gracias nuevamente por su paciencia y disposición para ayudar.

¿Fue útil?

Solución

No veo nada malo en su preparación de la declaración o el uso de parámetros, pero hay algo mal en sus resultados de enlace:

http://php.net/manual/en/mysqli -stmt.bind-result.php dice:

  

Tenga en cuenta que todas las columnas deben estar enlazadas   después de mysqli_stmt_execute () y anterior   para llamar a mysqli_stmt_fetch () .

(énfasis mío)


El documento anterior debe tomarse como todas las columnas de su consulta, no todas las columnas de su tabla.

Bien, acabo de probar esto yo mismo. Si omito la columna $ name , aparece esta advertencia:

PHP Warning:  mysqli_stmt::bind_result(): Number of bind variables doesn't 
match number of fields in prepared statement in mysqli.php on line 9
PHP Stack trace:
PHP   1. {main}() /Users/bill/workspace/PHP/mysqli.php:0
PHP   2. mysqli_stmt->bind_result() /Users/bill/workspace/PHP/mysqli.php:9

Pero sí obtiene los datos.

Si enlazo $ name y $ content a los resultados de la consulta, funciona sin error ni advertencia.

Así que me veo obligado a preguntarle: ¿está seguro de que hay una fila en la base de datos que coincide con su condición? Es decir, ¿dónde name = 'introducción' ? Tenga en cuenta que en SQL, las comparaciones de cadenas distinguen entre mayúsculas y minúsculas de forma predeterminada.

Un error que veo que la gente comete con frecuencia es que se conectan a una base de datos diferente en su script PHP que la base de datos que usan para consultas ad hoc. Por lo tanto, debe estar absolutamente seguro de que está verificando que los datos existen en la base de datos correcta.

Otros consejos

¿No debería ser eso?

$stmt->bind_result($name, $content);

Al seleccionar 2 columnas

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