mysqli - statement - Declaración preparada que no devuelve nada
sentencias preparadas php mysqli (2)
¿No debería ser eso?
$stmt->bind_result($name, $content);
Al seleccionar 2 columnas
Perdóneme 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!
EDIT 1: Solo una actualización de mi progreso mientras intento solucionar problemas. Me di cuenta de que, dado que tengo una columna de identificación como índice en la tabla de secciones, necesitaba vincular eso también 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 de nuevo a todos los que pueden ofrecer sugerencias. (Tengo curiosidad: me resulta difícil depurar al usar el estilo de OOP de las declaraciones preparadas de esta manera. ¿Hay, por ejemplo, una manera fácil de simplemente ver la consulta que se utilizó realmente?)
EDIT 2: Hola, y gracias por hacer esa prueba, realmente lo aprecio. Entiendo la pregunta que te has visto obligado a hacer, ya que ahora también he pensado mucho en ello. 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. Si, sin embargo, 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 (no dude en gritar si no, por supuesto), no consigo nada. Además, con ese código, cuando hago una validación html (por si acaso), aparece una advertencia del servidor interno (500), que considero un problema con el código sql. ¿Estoy loco?
Gracias por su ayuda continua, ¡es muy apreciada!
EDIT 3: Bueno, me siento como un idiota, pero lo arreglé, y Bill, tu pregunta fue correcta. No sé cómo diablos logré poner los detalles de la base de datos incorrectos y los extraño por mucho tiempo, pero eso fue precisamente lo que sucedió.
Gracias de nuevo por su paciencia y disposición para ayudar.
No veo nada de malo en su preparación de la declaración o el uso de parámetros, pero hay algo mal en sus resultados vinculantes:
http://php.net/manual/en/mysqli-stmt.bind-result.php dice:
Tenga en cuenta que todas las columnas deben vincularse después de
mysqli_stmt_execute()
y antes de llamar amysqli_stmt_fetch()
.
(énfasis mío)
El documento anterior debe tomarse como todas las columnas en su consulta, no todas las columnas en su tabla.
De acuerdo, solo intenté 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 busca los datos.
Si ato los $name
y $content
a los resultados de la consulta, funciona sin error o advertencia.
Así que me veo obligado a preguntarle: ¿está seguro de que hay una fila en la base de datos que coincida con su condición? Es decir, ¿dónde name = ''introduction''
? Tenga en cuenta que en SQL, las comparaciones de cadenas distinguen entre mayúsculas y minúsculas por defecto.
Un error que veo que las personas hacen con frecuencia es que se conectan a una base de datos diferente en su script PHP que la base de datos que utilizan 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.