¿No es seguro incrustar código PHP en una función de JavaScript? Mi amigo me dijo que no lo hiciera.

Mi script simplemente inserta un número en la base de datos si se ha hecho clic en el mensaje (leído).

<!--Insert into database when click-->
<script>
    function insert()
    { 
        <?php
        include 'db_connect.php';
        $usermsg = $_SESSION['username'];
        $message_id = $_GET['messageid'];
        mysql_query("UPDATE messages SET message_read='1' WHERE id='$message_id' AND to_user='$usermsg'");
        ?> 
    }
</script>

¿Debo hacer esto de otra manera? ¿O dejar de incluir php y mysql en mi script y comenzar de nuevo?

-3
Kaizokupuffball 8 sep. 2011 a las 20:24

4 respuestas

La mejor respuesta

Si prueba ese código, ni siquiera funcionará de esa manera. No puede incrustar el código del lado del servidor en la función de JavaScript.

Lo que desea es hacer una solicitud por separado que maneje la solicitud. Este método se llama AJAX. Con la biblioteca jQuery puede hacer solicitud AJAX POST de esta manera:

<script>
    function insert()
    { 
       //Example: Request the test.php page and send some additional data along (while still ignoring the return results).
       $.post("test.php", { messageid: "1" } );
    }
</script>

En test.php:

<?php 

  //Get Post Variables. The name is the same as 
  //what was in the object that was sent in the jQuery

  if (isset($_POST['messageid'])) {
      include 'db_connect.php';
      $usermsg = $_SESSION['username'];
      $message_id = $_POST['messageid'];
      mysql_query("UPDATE messages SET message_read='1' WHERE id='$message_id' AND to_user='$usermsg'");
  }

?>

Lea la Guía para principiantes sobre el uso de AJAX con jQuery

Y no olvide use sql parametrizado para evitar sql ataques de inyección ya que este código en su estado actual es vulnerable.

4
Community 23 may. 2017 a las 12:02

PHP / MySql se ejecuta en el servidor web. Javascript se ejecuta en el navegador.

También debe pensar que todo lo que proviene del navegador puede ser falso, por lo tanto, debe validarlo / verificarlo. Javascript solo hace que la experiencia de los usuarios sea más interactiva, ya que no requiere comunicación a través de la red. Use AJAX o formularios para hacer las comunicaciones.

1
Ed Heal 8 sep. 2011 a las 16:38

Tu amigo probablemente te dijo que no lo hicieras porque no tiene ningún sentido.

PHP es un lenguaje de preprocesamiento cuyo analizador se ejecuta en el servidor web. El resultado de ejecutar PHP es el HTML / Javascript que ve su navegador. Su PHP no genera nada (simplemente realiza silenciosamente la consulta SQL mientras se genera su página HTML / Javascript), por lo que el Javascript que ve su navegador es:

<script>
    function insert()
    { 
    }
</script>

PHP no puede estar "dentro" de una función Javascript en absoluto. No existe tal concepto.

En cambio, considere un HTML form, o lea sobre "AJAX" cuando esté un poco más familiarizado con la jerarquía de tecnologías web.

10
Lightness Races in Orbit 8 sep. 2011 a las 16:28

Es inseguro ya que es completamente posible que PHP inserte texto en la página que rompe el javascript. p.ej.

<?php
    $name = "O'Brien";
?>

<script type="text/javascript">
   var name = <?php echo $name ?>;
</script>

Esto produciría:

   var name = O'Brien;

Que es una sintaxis JS ilegal. Está asignando una variable indefinida O, que es seguida inmediatamente por un literal de cadena sin terminar 'Brien. Al rodear esto con citas en la página PHP tampoco se logra nada:

  var name = '<?php echo $name ?>';
             ^                   ^-- added quotes

Que ahora da

  var name = 'O'Brien';

Ahora tiene un problema ligeramente diferente: asignar un literal de cadena perfectamente válido 'O', seguido inmediatamente por una variable indefinida Brien, seguida de un literal de cadena no terminado ';.

La forma correcta de tener texto de salida PHP en un bloque de código JS de forma segura es usar json_encode:

 var name = <?php echo json_encode($name) ?>;

Que produce:

 var name = "O'Brien";

Y listo

2
Marc B 8 sep. 2011 a las 17:06