2012-09-10 10 views
20

¿Existe una manera fácil de enlazar múltiples valores en PDO sin repetición? Eche un vistazo al siguiente código:Encuadernación de múltiples valores en pdo

$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)"); 

$result_set->bindValue(':username', '~user'); 
$result_set->bindValue(':password', '~pass'); 
$result_set->bindValue(':first_name', '~John'); 
$result_set->bindValue(':last_name', '~Doe'); 

$result_set->execute(); 

Aquí, combiné los valores de una manera repetida que es 4 veces. Entonces, ¿hay una manera fácil de enlazar múltiples valores en PDO?

Respuesta

29

Siempre se puede obligar a valores dentro de los argumentos de execute() el tiempo que usted está muy bien con los valores que se tratan como PDO::PARAM_STR (cadena).

$result_set = $pdo->prepare("INSERT INTO `users` (`username`, `password`, `first_name`, `last_name`) VALUES (:username, :password, :first_name, :last_name)"); 
$result_set->execute(array(
    ':username' => '~user', 
    ':password' => '~pass', 
    ':first_name' => '~John', 
    ':last_name' => '~Doe' 
)); 

Puede utilizar la matriz pasada como cualquier matriz:

$user = "Nile"; 
$pdo->execute(array(":user" => $user)); 
+0

¿Cómo es esto válido? El método 'execute' no toma ningún parámetro? – Brett

+1

@Brett ¿ha comprobado las especificaciones? lo hace ... para pasar parámetros a la consulta puede usar [PDOStatement :: bindParam() o pasarlo como un parámetro a través del método 'execute()'] (http://php.net/manual/en/ pdostatement.execute.php). – jeremy

+0

Malo, estaba pensando que estabas hablando de [esto] (http://php.net/manual/en/mysqli-stmt.execute.php). – Brett

5

Si desea vincular en función del tipo (cadena, int, etc.), entonces no. Si estás bien con la unión todo como una cadena:

$stmt = $db->prepare("..."); 
$stmt->execute(array(
    'foo' => 'bar', 
    'something' => 'else', 
    'third' => 'thing', 
)); 
+1

¿Este trabajo con variables Si cambiara '' bar' sean a $ bar' sean en el que se asigna una cadena de ''bar''? –

+1

sí, lo hará ... – jeremy

2

Para realmente no escriba nada en dos ocasiones, se puede utilizar una matriz para suministrar los datos, y utilizar una función en esa misma matriz para dar salida a la parte vinculante de la consulta MySQL. Por ejemplo: los nombres de

function bindFields($fields){ 
    end($fields); $lastField = key($fields); 
    $bindString = ' '; 
    foreach($fields as $field => $data){ 
     $bindString .= $field . '=:' . $field; 
     $bindString .= ($field === $lastField ? ' ' : ','); 
    } 
    return $bindString; 
} 

los datos y columna provienen de una sola matriz asociativa ($data). A continuación, utilice bindFields($data) para generar una cadena de column = :column pares para concatenar en la consulta de MySQL:

$data = array(
    'a_column_name' => 'column data string', 
    'another_column_name' => 'another column data string' 
); 

$query = "INSERT INTO tablename SET" . bindFields($data); 

$result = $PDO->prepare($query); 
$result->execute($data); 

bindFields($data) de salida:

a_column_name=:a_column_name,another_column_name=:another_column_name 
+0

Lo había publicado originalmente como una pregunta/respuesta separada ([aquí] (http://stackoverflow.com/questions/23282160/is-there-a-shortcut-for-binding-named-pdo-params-for-mysql -inserts/23282161)) antes de encontrar esta pregunta, pero ahora han marcado eso como un duplicado. – equazcion

Cuestiones relacionadas