How can I insert data into two or more tables at the same time?

1

I'm using

$sql = "INSERT INTO factura (user_id, fecha) VALUES ($userid, '$date')"; 
$sql = "INSERT INTO boleto (sala, horario, asiento, user_id)" VALUES ('$sala', '$horario', '$asiento', $userid)";

 mysqli_query ($conn, $sql);                                            
 header("Location: ../index.php?signup=success");"

Y

$sql = "INSERT INTO factura (user_id, fecha) VALUES ($userid, '$date')" AND $sql = "INSERT INTO boleto (sala, horario, asiento, user_id) VALUES ('$sala', '$horario', '$asiento', $userid)";

But when checking in the database, just insert the data in invoice or ticket = S

    
asked by Hoozuki 18.06.2018 в 17:54
source

1 answer

3

The most convenient thing is that you execute them separately or that you identify them differently.

In any case, when you call mysqli_query once, you will run the query with the last value in $sql .

Maybe you could also deal with mysqli_multi_query , although it would not have much advantage here.

It would be enough to do this:

$insertFactura = "INSERT INTO factura (user_id, fecha) VALUES ($userid, '$date')"; 
$insertBoleto = "INSERT INTO boleto (sala, horario, asiento, user_id) VALUES ('$sala', '$horario', '$asiento', $userid)";

 mysqli_query ($conn, $insertFactura);                                            
 mysqli_query ($conn, $insertBoleto);                                            

 header("Location: ../index.php?signup=success");"

Or:

$sql = "INSERT INTO factura (user_id, fecha) VALUES ($userid, '$date')"; 
 mysqli_query ($conn, $sql);                                            

$sql = "INSERT INTO boleto (sala, horario, asiento, user_id) VALUES ('$sala', '$horario', '$asiento', $userid)";
 mysqli_query ($conn, $sql);      

 header("Location: ../index.php?signup=success");"

In the second query there was a syntax error ( " before VALUES ).

  

NOTE: Your queries are highly vulnerable to SQL injection attacks. You should implement queries prepared to prevent   that security risk.

The best solution

I propose here a code using prepared queries, to neutralize possible SQL injection attacks in this way.

In the comments I have explained the essential elements of this highly recommended practice , which should be implemented not without delay.

/*
    *Una variable utilitaria para ir recogiendo lo ocurrido en el flujo del código
*/
$strMensaje="";


/*
    *PRIMERA CONSULTA:
    *Dos marcadores ?,? que sustituyen a los valores reales
    *neutralizando así la inyección
*/
$insertFactura = "INSERT INTO factura (user_id, fecha) VALUES (?, ?)"; 

/*
    *Preparamos la 1ª consulta dentro de un condicional
    *así controlamos cualquier fallo en el else
*/
if ($stmt = mysqli_prepare($conn, $insertFactura)) {
    /*
        *Es aquí donde se pasan los valores provenientes del exterior
        *de modo que es imposible que te cuelen código malicioso
        *porque esté método te protegerá de eso precisamente
        *Aquí lo importante a comprender es que
        * - 1. Donde está esto: "is" se deben poner 
               tantas iniciales como signos ? haya en la consulta (dos en este caso)
               Esas iniciales indican el tipo de dato de la columna respectiva
               Si es un (i)nteger, si es un (s)tring, etc.
          - 2. Se escriben luego las variables (sin comillas ni nada), en el mismo orden
               en que aparecen en la sentencia INSERT de más arriba
    */
    mysqli_stmt_bind_param($stmt, "is", $userid, $date);

    /*
        *Se ejecuta la consulta
    */
    mysqli_stmt_execute($stmt);
    $strMensaje.="La inserción en factura fue exitosa. Filas insertadas: ".mysqli_stmt_affected_rows($stmt).PHP_EOL;
}else{
    $strMensaje.="La inserción en factura fue errónea. Error: ".mysqli_stmt_error($stmt).PHP_EOL;

}

/*
    *SEGUNDA CONSULTA:
    *Es casi todo igual que en la 1ª
    *Cuatro marcadores ?,?,?,? que sustituyen a los valores reales
*/  

$insertBoleto = "INSERT INTO boleto (sala, horario, asiento, user_id) VALUES (?,?,?,?)";

if ($stmt = mysqli_prepare($conn, $insertBoleto)) {
    /*
        *Lo mismo que se explicó antes
        *Nótese que aquí tenemos "sssi", porque en $insertBoleto hay 4 columnas
        *Las tres primeras son de un tipo string (VARCHAR), por eso las sss
        *y la última es un entero, por eso la i 
    */
    mysqli_stmt_bind_param($stmt, "sssi", $sala, $horario, $asiento, $userid);
    mysqli_stmt_execute($stmt);
    $strMensaje.="La inserción en boleto fue exitosa. Filas insertadas: ".mysqli_stmt_affected_rows($stmt).PHP_EOL;
}else{
    $strMensaje.="La inserción en boleto fue errónea. Error: ".mysqli_stmt_error($stmt).PHP_EOL;

}

/*
    *Una vez terminado todo, imprimimos lo que se recogió en la variable utilitaria
    *Esto tiene la ventaja de que te informará de lo que ocurrió en ambas consultas
*/

echo $strMensaje;
    
answered by 18.06.2018 / 18:05
source