0

En el primer ejemplo, me sale error... Le hice un var_dump a la variable y pues contiene todo, pero aún así da error. En el segundo ejemplo, quito la variable y pongo un texto cualquiera y sin problemas edita todo en la base de datos, entonces que puede estar pasando?

// CON ESTE EJEMPLO ME DA ERROR
if (strlen($message_by) > 0 && strlen($message_content) > 0) {
            
            $x = mysqli_query($base,"UPDATE $accounts SET message_content = '$message_content' WHERE message_by = '$message_by' OR message_destiny = '$message_by'"); 
            
            if (!$x) {
                
                echo "Error".var_dump($message_content);
                
            } else {
                
                echo "Editado";
                
            }
            
        }
        
// CON ESTE EJEMPLO ME MUESTRA EL 'EDITADO' Y EN LA BASE DE DATOS TODO CAMBIA
if (strlen($message_by) > 0 && strlen($message_content) > 0) {
            
            $x = mysqli_query($base,"UPDATE $accounts SET message_content = 'Ya no llamo la variable' WHERE message_by = '$message_by' OR message_destiny = '$message_by'"); 
            
            if (!$x) {
                
                echo "Error".var_dump($message_content);
                
            } else {
                
                echo "Editado";
                
            }
            
        }
Nuevo Usuario
  • 423
  • 4
  • 17
  • ¿Cuál es el mensaje de error del primer script? – BetaM Oct 04 '21 at 04:27
  • @BetaM El echo que tengo definido... – Nuevo Usuario Oct 04 '21 at 04:28
  • Revisa el ejemplo procedimental que ayuda a obtener el posible fallo en la query: https://www.php.net/manual/es/mysqli.error.php#refsect1-mysqli.error-examples una vez hecho eso por favor agrégalo a tu pregunta – BetaM Oct 04 '21 at 04:31
  • @BetaM ErrorYou have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near – Nuevo Usuario Oct 05 '21 at 01:34

1 Answers1

1

Dos cosas:

  1. Falta el else de este bloque: if (strlen($message_by) > 0 && strlen($message_content) > 0) { Nunca dejes áreas sin cubrir en el flujo de tu código. Si hay una situación de else aquí lo único que el usuario tendrá es una pantalla en blanco.

  2. En fase de depuración muestra el error en sí mismo, así sabrás con más exactitud lo que estaría pasado. Uno de los posibles errores aquí es un duplicated key. Y, aparte de eso, en consultas de tipo UPDATE, INSERT o DELETE, convendría verificar la cantidad de filas afectadas. Una consulta de este tipo puede ser exitosa (no dar error) pero no modificar nada, porque el criterio WHERE no se cumple, o porque no hay nada que actualizar (en caso de mandar a actualizar con datos que son los mismos que ya existen).

Haciendo esto, deberías saber con exactitud lo que está ocurriendo:

// CON ESTE EJEMPLO YA NO ME DA ERROR
if (strlen($message_by) > 0 && strlen($message_content) > 0) {                
    $x = mysqli_query($base,"UPDATE $accounts SET message_content = '$message_content' WHERE message_by = '$message_by' OR message_destiny = '$message_by'");                
    if (!$x) {
        #Sólo en fase de depuración. Quitar luego mysqli_error
        echo "Error: ".mysqli_error($base);
    } else {
        echo "Filas editadas: ".mysqli_affected_rows($base);
    }
} else {
    echo "No se cumple la condición inicial";
}

Dos recomendaciones

  1. Tu código es altamente vulnerable a ataques de Inyección SQL. Considera usar consultas preparadas para corregir ese gravísimo problema de seguridad.
  2. Considera migrar tu código mysqli al estilo orientado a objetos. Es más claro y menos verboso que el estilo procedural.
A. Cedano
  • 86,578
  • 19
  • 122
  • 221
  • Aparece: ErrorYou have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near – Nuevo Usuario Oct 05 '21 at 01:33
  • Ese error me sale junto a esta linea donde es un json que trato de guardar, creo que es por las comillas?: 'message_by':'loco@gmail.com','message_content':'d','message_destiny':'loca@gmail' – Nuevo Usuario Oct 05 '21 at 02:16
  • @NuevoUsuario **depura** tu código. Escribe la instrucción SQL en una variable: `$sql="UPDATE $accounts SET message_content = '$message_content' WHERE message_by = '$message_by' OR message_destiny = '$message_by'";` y luego imprímela y revísala: `echo $sql;` Si no logras ver el error muéstranos el contenido que tendría `$sql`. Es una cuestión básica de **depuración**. Si algo no funciona, revísalo, analízalo. Puede que en la variables que contiene la instrucción SQL haya datos extraños que rompan el código, creando un error de sintaxis. – A. Cedano Oct 05 '21 at 09:38
  • El error de sintaxis es lo menos grave que te podría pasar. Como señalé al final de la respuesta, tu código está expuesto a ataques de *Inyección SQL*, por tanto, la solución definitiva a esto será implementar consultas preparadas. – A. Cedano Oct 05 '21 at 09:51
  • No uso las consultas preparadas porque lo único que me hace falta es obtener el la información con while. – Nuevo Usuario Oct 06 '21 at 04:32
  • @NuevoUsuario el problema es que si expones este programa (en una web o en otros entornos) un usuario mal intencionado podría atacar al servidor usando como puerta de entrada SQL. Ten en cuenta que desde SQL se pueden hacer cosas como guardar archivos en el servidor (imagina que te inyectan un troyano por esa vía) y se puede también sustraer / modificar información sensible. – A. Cedano Oct 06 '21 at 13:13
  • Anteriormente había preguntado algo sobre cómo traer datos con while en una consulta preparada en la cual no me respondiste o no me explicaste bien: https://es.stackoverflow.com/questions/485681/c%c3%b3mo-traer-los-datos-de-la-cuenta-con-while?noredirect=1#comment863516_485681 – Nuevo Usuario Oct 07 '21 at 02:47
  • @NuevoUsuario en la respuesta que refieres asumí que para ese contexto necesitabas **una sola fila** (lee lo dicho en el punto (1) luego del código). En ese caso no es necesario usar `while`. Por otro lado, en la respuesta que refieres sí se usa consulta preparada. Usar o no usar `while` no tiene nada que ver con la seguridad. – A. Cedano Oct 07 '21 at 07:33
  • No me refiero a la seguridad, si no que ya estaba usando consultas preparadas pero lo único que me falta es obtener los datos con while en consultas preparadas, porque necesito obtener varias filas como nombre etc... – Nuevo Usuario Oct 10 '21 at 17:12
  • @NuevoUsuario en el punto (1) de la respuesta a la otra pregunta decía que asumía (por lo que había en tu código) que se buscaba un conteo o una verificación, en cuyo caso con que haya una sola fila basta. Decía también que si requerías más de una fila me lo dijeras en comentarios. Si necesitas más de una fila me lo confirmas y puedo modificar aquella respuesta mostrando cómo se obtendría más de una fila con `while`. OJO: Se necesita saber con exactitud qué columnas quieres y cómo se llaman, porque en mysqli hay que hacer bind_result de cada columna. – A. Cedano Oct 10 '21 at 17:31