2015-07-09 5 views
4
$rate=[10,20,40,50,70]; 

Как вставить значение в запрос ниже?Как вставить массив в базу данных

$sql="INSERT INTO rental(day_1,day_3,day_7,day_15,day_30) 
     VALUES('{$rate[0]}','{$rate[1]}', '{$rate[2]}','{$rate[3]}','{$rate[4]}')"; 

$stmt =connection::$pdo->prepare($sql); 
$stmt->execute(); 

Я попытался ниже, но он вставляет одинаковое значение во всей колонке для записи и создает новую запись для каждого нового значения:

foreach($rate as $key->$value) 
{ 
    $sql="INSERT INTO rental(day_1,day_3,day_7,day_15,day_30) 
      VALUES('{$value}','{$value}', '{$value}','{$value}','{$value}')"; 

    $stmt =connection::$pdo->prepare($sql); 
    $stmt->execute(); 

Edited на основе ответа, данного

public function rentalRate() 
    { 

$rate = implode("','",$this->rate); 
$sql = "INSERT INTO rental(day_1,day_3,day_7,day_15,day_30)VALUES('$rate')"; 
$stmt =connection::$pdo->prepare($sql); 
     $stmt->execute(); 
     unset($rate); 
    } 
+0

Не содержит ли первичный ключ арендной платы? –

+0

@EsbenSkovPedersen да – 112233

ответ

5

Simply использовать implode и все в этом размере

$rate = [10,20,40,50,70]; 
$rate = implode("','",$rate); 
$sql = "INSERT INTO rental(day_1,day_3,day_7,day_15,day_30)VALUES('$rate')"; 
echo $sql; 
+1

Если все числовое, это сработает. Если у вас есть строка, у вас есть проблемы ;-) – Richard

+1

Как насчет этого обновленного ответа @RichardReiber –

+1

Хорошее решение :-) – Richard

0

В этом случае Foreach не полезен, поскольку вы хотите интегрировать более одного элемента массива в одном запросе и у вас нет многомерного массива. Просто используйте свой первый запрос:

$sql = "INSERT INTO rental(day_1,day_3,day_7,day_15,day_30)VALUES('{$rate[0]}','{$rate[1]}', '{$rate[2]}','{$rate[3]}','{$rate[4]}')"; 

И - если вы действительно хотите использовать Еогеасп:

$sql = "INSERT INTO rental(day_1,day_3,day_7,day_15,day_30)VALUES("; 
foreach($rate as $value) 
    $sql .= "'$value', "; 
$sql = rtrim($sql, ", ") . ")"; 
0

только простой (примечание взрывать будет работать только с целыми числами, без необходимости quoate)

$rate=[10,20,40,50,70]; 
$r_sql = ''; 
foreach($rate as $r) { 
    $r_sql.="'$r',"; 
} 
$r_sql = trim($r_sql,','); 
$sql="INSERT INTO rental(day_1,day_3,day_7,day_15,day_30)VALUES(".$r_sql.")"; 
+1

См. Ответ Uchiha, очень приятное решение для строк (конечно, массив должен быть раньше проходили, чтобы предотвратить инъекции SQL). – Richard

0

Обычно массивы вставляются в другой стол, и все инструменты ориентированы на это. Обычно лучше не бороться с инструментами или, скорее всего, столкнуться с непредвиденными проблемами.

Если мы добавим

table rental_day(id(int), rental_id(int,fk), rate(money)) 

Тогда для всех элементов в массиве, мы просто вставить элемент в одну строку в rental_day

позже, когда нам нужна информация назад, мы можем запросить его, как

select * from rental_day d inner join rental r on d.rental_id=r.id where r.id=something 

и вы получите всю информацию от rent_day и аренды по одному запросу.

Смежные вопросы