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;