Pregunta

Estoy aprendiendo PHP y MySQL y estoy creando un sitio web de películas con fines de aprendizaje.

Quiero insertar variables y matrices que contengan información de películas en una base de datos pero en diferentes tablas.

Esto es lo que tengo ahora:

include('inc/connection.php');
$conn = dbConnect();

// create SQL
$sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
    VALUES(?, ?, ?, ?, ?)';

// initialize prepared statement
$stmt = $conn->stmt_init();
if ($stmt->prepare($sql)) {
    // bind parameters and execute statment
    $stmt->bind_param('isiis', $movieid, $title, $year, $runtime, $plot);
    $stmt->execute();
}

Esto inserta las variables en la tabla de películas.

Pero también necesito insertar (al mismo tiempo) los géneros de la película, los actores, los idiomas, etc. están en matrices y van en tablas diferentes (y tal vez también en filas diferentes). Por ejemplo, la matriz que contiene los géneros (Acción, Crimen, Drama) en la tabla de géneros, y los actores en la tabla de actores y así sucesivamente ... Luego usaré tablas de muchos a muchos y de uno a muchos para muestra la información.

¿Puede alguien explicarme cómo hacer esto? ¿Necesito conectarme a la base de datos varias veces? Necesito bucles? Soy realmente nuevo en PHP y MySQLi, así que intenta explicar todo lo que puedas.

Gracias.

¿Fue útil?

Solución

INSERT solo admite una tabla a la vez, por lo que seguramente tendrá que ejecutar varias instrucciones INSERT si tiene datos complejos que se encuentran en varias tablas.

Si ha insertado un valor específico de $ movieid en movies , entonces sabe qué valor necesita insertar en las filas de las otras tablas, para satisfacer la integridad referencial (Sigue pseudocódigo, ejemplo no completamente funcional):

$movies_sql = 'INSERT INTO movies (movieid, title, year, runtime, plot)
        VALUES(?, ?, ?, ?, ?)';

// execute ($movieid, ...)

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (?, ?)';

foreach ($actorlist as $actorid) {
    // execute ($movieid, $actorid)
}

$lang_sql = 'INSERT INTO movie_languages (movieid, language) 
    VALUES (?, ?)';

foreach ($languagelist as $language) {
    // execute ($movieid, $language)
}

Si su tabla movies usa una clave primaria AUTO_INCREMENT , puede obtener el valor generado durante la primera INSERT llamando a $ mysqli- > insert_id () , o utilizando la función incorporada LAST_INSERT_ID () .

$actors_sql = 'INSERT INTO movie_actors (movieid, actorid) 
    VALUES (LAST_INSERT_ID(), ?)';
foreach ($actorlist as $actorid) {
    // execute ($actorid) -- only one param in this INSERT
}

Tenga en cuenta que LAST_INSERT_ID () informa el valor autogenerado más reciente durante su sesión actual, por lo que si inserta en otra tabla que usa una clave primaria automática, el valor cambia. Pero el valor informado es estable durante sus sesiones; no no cambia si otra sesión del cliente realiza inserciones simultáneamente.

Otros consejos

  1. Solo necesita una conexión de base de datos
  2. Sí, necesitas bucles
  3. Use un campo de clave primaria auto_increment en cada tabla, y luego use $ stmt- > insert_id () para extraer el valor después de cada insert
  4. Si puede, use InnoDB en el servidor MySQL para obtener soporte para transacciones, y luego commit se actualizan juntos para asegurar que su base de datos sea coherente si su script se cae. A mitad de camino a través de una actualización. El formato de tabla de base de datos MyISAM más común no admite transacciones.

No necesita usar más de una conexión de base de datos; de hecho, eso es lo que no debe hacer en absoluto, porque no puede agrupar sus insertos en una transacción atómica.

Lo que debe hacer (resumen) es:

BEGIN;
INSERT INTO Genres...;
INSERT INTO Actors...;
INSERT INTO othertable....;
and so on, for referenced columns/tables.
INSERT INTO Movies....;
COMMIT;

De esta forma, siempre debe tener un conjunto de datos coherente.

es probable que busque claves externas: use un ID de la tabla base para identificar otras relaciones en otra tabla (use movieid en otra tabla para identificar a qué película pertenecen los otros valores, etc.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top