Método PREPARE de PHP me arroja ERROR FATAL!

Iniciado por big_ed, 19 Agosto 2019, 20:25 PM

0 Miembros y 1 Visitante están viendo este tema.

big_ed

Hola a todos  ::)

Php me arroja el siguiente error: Fatal error: Uncaught Error: Call to a member function bind_param() on bool in /opt/lampp/htdocs/php y sql/practice/zend.php:17 Stack trace: #0 {main} thrown in /opt/lampp/htdocs/php y sql/practice/zend.php on line 17

Lo que se me ocurre es que pueda estar exigiendo que incluya el campo 'id' (y su valor) en la consulta del PREPARE, pero para mi hacer eso no tiene sentido porque se supone que los valores del campo 'id' se generan solos automaticamente.
Dejo mi código, y más abajo mi base de datos:


<?php
$MARIA 
= new mysqli("localhost""root""""EMPLOYER");

if ( 
$MARIA->connect_error ) {
    echo 
"Falló la conexión!";
} else {
    
$PRE $MARIA->prepare"INSERT INTO EMPLOYER (nombre, sexo, edad, puesto, sueldo, correo, movil, casa) VALUES (?, ?, ?, ?, ?, ?, ?, ?)" );
    
$PRE->bind_param('ssisfsis'$nombre$sexo$edad$puesto$sueldo$correo$movil$casa);

    
$nombre 'Gian'
    
$sexo 'Hombre';
    
$edad 25;
    
$puesto 'Marketing';
    
$sueldo 3.500;
    
$correo 'gian@mark.es';
    
$movil 989543723;
    
$casa 'Av. Los Sauces';

    
$PRE->execute();

    echo 
"Los datos fueron enviados!";

    
$MARIA->close();
}
?>




MinusFour

¿Porque no checas el error que tienes en el prepare? Ese error que tienes es simplemente porque $MARIA-prepare() te regreso falso, que significa que hay un error con tu enunciado ahí.

Para eso tienes que usar mysqli::error:

Código (php) [Seleccionar]

if($PRE === false) throw new Exception($MARIA->error);

big_ed

Cita de: MinusFour en 19 Agosto 2019, 21:21 PM
¿Porque no checas el error que tienes en el prepare? Ese error que tienes es simplemente porque $MARIA-prepare() te regreso falso, que significa que hay un error con tu enunciado ahí.

Para eso tienes que usar mysqli::error:

Código (php) [Seleccionar]

if($PRE === false) throw new Exception($MARIA->error);


No funcionó con ese código que me pusiste, pero ya me di cuenta donde está el error al revisar minusiozamente el codigo y despavilar.

FUe un error estúpido de mi parte,  en el INSERT estaba escrito mal el nombre de la tabla, el cual era DATOS, en lugar de EMPLOYER (employer es la base de datos, me confundí). Segundo: En bind_param('ssisfsis' ) No existe el argumento F (de float) sino D (de double). A pesar de que el campo en mi base de datos es de tipo float y no double, no me genera error. Corrigiendo ambas cosas, funcionó.

Disculpen las molestias.

Pregunta aparte, para no abrir otra tema (si no tendré que hacerlo):
¿con estas sentencias preparadas ya no necesito preocuparme por temas de seguridad?
Es decir ¿asi puedo mandar los datos de manera medianamente segura? ¿o me falta algo?
Claro que antes de hacer el 'prepare' debo impedir el ingreso de datos incorrectos, con las expresiones regulares de java script y luego de php. Eso lo tengo claro.

engel lex

CitarNo funcionó con ese código que me pusiste

ese codigo no era para que funcionara, era para que consiguieras el error, ese codigo lo que hace es no pasar la consulta erronea ciegamente, sino verifica si fue valida...

Citar¿con estas sentencias preparadas ya no necesito preocuparme por temas de seguridad?
Es decir ¿asi puedo mandar los datos de manera medianamente segura? ¿o me falta algo?

si ayuda, no es super seguro, pero sobre todo ayuda a limpiar los errores dejados atrás por ti como humano

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

big_ed

Cita de: engel lex en 19 Agosto 2019, 21:58 PM
ese codigo no era para que funcionara, era para que consiguieras el error, ese codigo lo que hace es no pasar la consulta erronea ciegamente, sino verifica si fue valida...
ya lo sé pero digo no arrojó ningún error.. lo mismo que no ponerlo

Cita de: engel lex en 19 Agosto 2019, 21:58 PM
si ayuda, no es super seguro, pero sobre todo ayuda a limpiar los errores dejados atrás por ti como humano
si, nada es 100% seguro, pero yo me refiero a si con eso ya puedo subir datos , digamos teniendo la idea de que ya lo estoy haciendo de una forma medianamente segura.
Porque por ejemplo si yo estuviera subiendo directamente con QUERY() ustedes me dirian que use las sentencias preparadas, como diciendo "tu codigo es inseguro"...por eso pregunto, ahora, con este codigo (prepare), ya es algo seguro, quiza no al 100%, pero al menos lo basico o medio?

engel lex

si es seguro, esto sirve para filtrar básicamente cualquier ataque de inyección que son los mas comunes, los parámetros afiliados son tratados como data y no van a ser mal interpretados y ejecutados maliciosamente...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

big_ed

Cita de: engel lex en 19 Agosto 2019, 22:50 PM
si es seguro, esto sirve para filtrar básicamente cualquier ataque de inyección que son los mas comunes, los parámetros afiliados son tratados como data y no van a ser mal interpretados y ejecutados maliciosamente...
ok gracias

y gracias tambien al otro usuario

big_ed

Cita de: MinusFour en 19 Agosto 2019, 21:21 PM
¿Porque no checas el error que tienes en el prepare? Ese error que tienes es simplemente porque $MARIA-prepare() te regreso falso, que significa que hay un error con tu enunciado ahí.

Para eso tienes que usar mysqli::error:

Código (php) [Seleccionar]

if($PRE === false) throw new Exception($MARIA->error);


Cita de: engel lex en 19 Agosto 2019, 22:50 PM
si es seguro, esto sirve para filtrar básicamente cualquier ataque de inyección que son los mas comunes, los parámetros afiliados son tratados como data y no van a ser mal interpretados y ejecutados maliciosamente...

Hola otra vez.

Estoy un poco confundido con 'prepare' al momento de retornar los datos de la DB a mi web.
Primero  ¿es necesario seguir usando Prepare para retornar los datos? Pregunto porque , en el caso anterior me parecia necesario porque debia cuidar los valores que entraban de afuera a mi base de datos, pero en el caso de que quiera "sacar" los valores de mi db no me parece que deba tomar medidas (o sea el proceso es interno, no a la vista de terceros). Yo sabía hacer esto con QUERY() y MSQLI_FETCH_ASSOC() pero ahora PREPARE() me confunde y no sé como llamar a los datos, me está dando error, estoy haciendo algo mal. Si me pudieran poner un ejemplo de como retornar los datos con prepare por favor, con la siguiente sentencia simple de ejemplo.. . SELECT nombre FROM datos