2011-06-04 15 views
6

tengo una tabla llamada propAmenities que tiene dos columnas amenity_id y property_id básicamente la tabla contiene las claves foráneas.¿Cómo inserto múltiples registros en un viaje de base de datos usando PDO?

ahora tengo que generar una consulta PDO utilizando marcador de posición con nombre para la siguiente declaración.

INSERT INTO propAmenities (amenity_id, property_id) VALUES (1, 1), (2, 1), (3, 1) 

intenté usar la siguiente sintaxis pero no estoy seguro de si esto funcionará.

$sth->$this->dbh->prepare('INSERT INTO 
          propAmenities 
          (amenity_id, property_id) 
          VALUES 
          (:amenity_id, :property_id), 
          (:amenity_id, :property_id), 
          (:amenity_id, :property_id)'); 

y para la consulta anterior, no estoy seguro de cómo utilizo el bindParam() de PDO ¿Cómo manejo esta situación usando PDO? ¿Estoy usando los Placeholders de PDO incorrectos?

Respuesta

5

Usted puede dar a los marcadores de posición de cualquier nombre que desee así que algo como esto para su SQL:

INSERT INTO propAmenities 
(amenity_id, property_id) 
VALUES 
(:amenity_id1, :property_id1), 
(:amenity_id2, :property_id2), 
(:amenity_id3, :property_id3) 

Y luego:

$stmt->bindParam(':amenity_id1', 1); 
$stmt->bindParam(':property_id1', 1); 
$stmt->bindParam(':amenity_id2', 2); 
$stmt->bindParam(':property_id2', 1); 
$stmt->bindParam(':amenity_id3', 3); 
$stmt->bindParam(':property_id3', 1); 

O, por supuesto, crear la matriz apropiada para execute. En este caso, los marcadores de posición sin nombre podrían ser más fáciles de trabajar sin embargo:

INSERT INTO propAmenities 
(amenity_id, property_id) 
VALUES 
(?, ?), 
(?, ?), 
(?, ?) 

y luego se puede recorrer sus valores y llamar a execute con la matriz apropiada:

$stmt->execute(array(1, 1, 2, 1, 3, 1)); 
+0

guau, esa fue una muy buena explicación, y además creo que es mejor usar marcadores de posición no nombrados que el nombre. –

+1

@Ibrahim: Gracias. Nombrado versus no nombrado depende del contexto. En este caso específico, los marcadores de posición sin nombre son probablemente más fáciles, pero si estuviera insertando filas con más de dos columnas, entonces los marcadores de posición con nombre (con sufijos numéricos como los anteriores) probablemente serían más fáciles de entender de un vistazo. En general, me inclino por los marcadores de posición con nombre ya que hacen que su código sea más fácil de entender y menos propenso a errores. OTOH, si está creando los marcadores de posición y valores usando matrices paralelas (una para los signos de interrogación, una para los valores), los marcadores de posición sin nombre podrían ser más fáciles. Por lo tanto, depende. –

-6

Es mucho más simple no usar una consulta preparada aquí, simplemente genere su cadena de consulta utilizando algunos implode() sy ejecútelo. Por supuesto, asegúrese de que sus parámetros estén correctamente citados (ya que son enteros, la aplicación de intval() es suficiente).

+1

-1, lo que veo ¿Por qué no puede lograr esto utilizando una declaración preparada? y dado que estoy usando el enfoque OO para mi proyecto, es altamente recomendable usar PDO. –

+3

-1, lo que sugiere que las consultas complejas deben evitar el mecanismo de seguridad estándar es una caja de Pandora que conduce a inyecciones de SQL. La consistencia es valiosa – Tom

Cuestiones relacionadas