Inserir várias linhas em mysql com PHP usando matrizes foreach
Pergunta
Im preso, vindo a tentar descobrir isso por 2 horas agora. Eu descobri o loop foreach, mas a figura não pode sair como inserir os dados agora.
aqui é o meu php, o que estou fazendo de errado?
$query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ";
foreach($_POST as $key => $value) {
$query .= "$thumb_path,$image_path,$main_image,$_POST[project_id])";
$result = mysql_query($query, $connection);
}
Obrigado!
Devo colocá-lo fora como esta, desculpe ainda um novato para foreach e como ele funciona.
foreach($_POST as $key => $value) {
$query = "INSERT INTO images VALUES (thumb_path, image_path, main_image, project_id),";
$query .= "$value[thumb_path], $value[$image_path], $value[$main_image], '$_POST[project_id'])";
}
$result = mysql_query($query, $connection);
Solução
Várias coisas errada aqui:
- Você está faltando um colchete de abertura em sua lista de valores (após
VALUES
) - Você está executando
mysql_query
em cada iteração doforeach
. Em vez disso, você provavelmente vai querer criar a cadeia primeiro (usando vários valores listas), emysql_query
run fora do loop. - Você não pode interpolar a variável
$_POST['project_id']
em uma seqüência dessa maneira - Você precisa escapar os dados
$_POST
antes de colocá-lo no banco de dados! - Você não está realmente usando o
$key
ou$value
do seu foreach em sua consulta, você está apenas descartá-lo. - As variáveis ??dentro do loop (
$thumb_path
etc.) será o mesmo para cada iteração do loop-assim que você está indo para inserir os mesmos dados de cada vez. - A lógica do circuito simplesmente não faz sentido. Você não sabe quanto tempo
$_POST
é, ou o que poderia estar nele, então por que você está looping sobre$_POST
?
Algumas dicas para ajudar você a corrigir tudo isso:
- Verifique se o seu log de erro.
-
var_dump
a string de SQL antes de executar a consulta para verificar se ele é sintaticamente e logicamente correta.
Se você quiser mais ajuda, eu sugiro que você var_dump
o que está em $_POST
, tentar escrever o que você pensa a consulta deveria parecer, e depois postar tanto aqui. Então, talvez, alguém vai ajudá-lo a ir de um para o outro.
Outras dicas
eu encontrar algo como este é muito mais fácil de manter do que uma concatenação repetida como você está fazendo:
$values = array();
foreach ($_POST as $key => $value) {
$qvalue = mysql_real_escape_string($value);
$values[] = "($field1, $field2, $field3, $qvalue)"; // quoted value, not the raw value
}
$query_values = implode(',', $values);
$query = "INSERT INTO images (field1, field2, field3, field4) VALUES $query_values";
$result = mysql_query($query, $connection);
Basta ter em mente que, quando a construção de uma consulta como esta, é perfeitamente possível construir um grande o suficiente consulta para, exceto o comprimento max_packet, caso em que você teria que dividir a inserção em várias consultas menores.
Em primeiro lugar, escapar $ _ POST [project_id] com mysql_real_esape_string.
Em seguida, os sintaxe são os valores da tabela INSERT INTO (...) (...)
// escape your input
$_POST = array_map('addslashes', $_POST);
// rather than recursively calling mysql_query, you can insert all your rows with one query
// INSERT INTO table (columns) VALUES (data), (data), (data), ...
$values = array();
foreach($_POST as $key => $value) {
$values[] = "('{$_POST['thumb_path']}', '{$_POST['image_path']}', '{$_POST['main_image']}', '{$_POST['project_id']}')";
}
if(sizeof($values)) {
$query = "INSERT INTO images (thumb_path, image_path, main_image, project_id) VALUES ".implode(',', $values);
$result = mysql_query($query, $connection);
}