0

実行したいMySQLステートメントがあり、このステートメント内にforループを含めて、データが入力される列を定義したいと考えています。

私が現在持っているコードは

$stmt = $conn->prepare('INSERT into DATA ('.
    for($i = 0; $i < count($columns); $i++) {
        echo $columns[$i];
    }
    .') VALUES ('.
    for($i = 0; $i < count($columns); $i++) {
       echo ':'.$columns[$i].' , ';
    }
    .')');

明らかにこれは機能しませんが、2 番目の for ステートメントでも機能する場合、各ループの最後にカンマがエコーされ、最後のループでエラーが発生するため、これを修正する方法はありますか?

前もって感謝します!

4

3 に答える 3

3

join/implode関数を使用します。

$params = array_map(function($var){return ':'.$var;}, $columns);
$sql = 'INSERT into DATA ('.join(',', $columns).') VALUES ('.join(',', $params).')';    
$stmt = $conn->prepare($sql);
于 2013-08-19T09:20:22.477 に答える
1

implodeを使用した別のアプローチ:

$sql = "INSERT into DATA (`"  . implode('`,`', $columns) . "`) values (:" . implode(',:', $columns) . ")"
$stmt = $conn->prepare($sql);

結果の例:

// Input array
$columns = array('A', 'B', 'C');

// Output
INSERT into DATA(`A`,`B`,`C`) values (:A,:B,:C)
于 2013-08-19T09:26:43.777 に答える
0

簡単にするために、 prepare() 関数のでクエリを作成する必要があります。

そのようなものがより良い/より明確になります:

$count = count ($columns); // Avoid using count in your loop init (Performances)
$query = 'INSERT INTO DATA (' .
for($i = 0; $i < $count; $i++) {
    $query .= $columns[$i];
}
$query .= ') VALUES (';
for($i = 0; $i < $count; $i++) {
   if ($i != $count - 1) $query.= ':'.$columns[$i].' , ';
   else $query .= ':'.$columns[$i]; // No coma for the last value
}
$query .= ')';
$stmt = $conn->prepare($query);
于 2013-08-19T09:25:54.297 に答える