-1

mysqli を使用してデータベースにデータを挿入する場合、これが以下で行う最善の方法であるか、それとももっと良い方法があるかを知りたいだけです。

 $insert = array();

  for ($i = 1, $n = $_SESSION['sessionNum']; $i <= $n; ++$i)
  {
    $insert[] = "'". mysqli_real_escape_string( $_SESSION['id'] ) . ($n == 1 ? '' : $i) . "','". mysqli_real_escape_string( $_SESSION['timeChosen'] ) ."','". mysqli_real_escape_string( date("Y-m-d", strtotime( $_SESSION['dateChosen'] ) ) ) ."'
,'". mysqli_real_escape_string( $_SESSION['textWeight'] ) ."','". mysqli_real_escape_string( $time ) ."','". mysqli_real_escape_string( $_SESSION['textMarks'] ) ."'
,'". mysqli_real_escape_string( $_SESSION['module'] ) ."','". mysqli_real_escape_string( $teacherid ) ."','". mysqli_real_escape_string( $_SESSION['rooms'] ) ."'";
  }

  $insertsql = "INSERT INTO Session (SessionId, SessionTime, SessionDate, SessionWeight, SessionDuration, TotalMarks, ModuleId, TeacherId, Room) 
  VALUES (" . implode('), (', $insert) . ")";

 $sqlstmt=$mysqli->prepare($insertsql);

 $sqlstmt->execute(); 
4

2 に答える 2

0

PDOを使用し、値をバインドする準備済みクエリを使用することをお勧めします。入力する値がたくさんある場合は、名前ベースのプレースホルダーではなく、位置ベースのプレースホルダーを使用できます。

<?php
// connect to your database
$pdo = new PDO('mysql:host=localhost;dbname=mydatabase', "username", "password");

// fill in the array, just one after the other since the placeholders will be numbered from 1 to ->count($insert)

$insert = array();

for ($i = 1, $n = $_SESSION['sessionNum']; $i <= $n; ++$i){
    $insert[] = $_SESSION['id'] . ($n == 1 ? '' : $i); 
    $insert[] = $_SESSION['timeChosen'];
    $insert[] = date("Y-m-d", strtotime( $_SESSION['dateChosen'])); 
    $insert[] = $_SESSION['textWeight']; 
    $insert[] = $time;
    $insert[] = $_SESSION['textMarks']; 
    $insert[] = $_SESSION['module']; 
    $insert[] = $teacherid;
    $insert[] = $_SESSION['rooms'];
}


$query = $pdo->prepare('INSERT INTO Session 
         (SessionId, SessionTime, SessionDate, SessionWeight, 
          SessionDuration, TotalMarks, ModuleId, TeacherId, Room) 
          VALUES' . 
          //repeat the 9 placeholders for $_SESSION['sessionNum'] and cut of the trailing ,
          substr(str_repeat('(?,?,?,?,?,?,?,?,?),',$_SESSION['sessionNum']),0,-1));

// now we bind the placeholder with the corresponding value in the array
for($i = 0;$i < count($insert);$i++){
    $query->bindParam(($i + 1),$insert[$i]);
}
// finally we execute the query
$query->execute();

そして、それは本当にそれです。(私はこれを記憶から書きました。テストはしていませんが、php -lについては行っていますが、一般的なアイデアは理解できますし、うまくいくと確信しています。;))

于 2012-06-13T23:17:29.457 に答える
0

プリペアド ステートメントを使用することの要点は、実行中の作業の半分を実行しないようにすることです。基本的な考え方は、基本的なクエリを作成して準備し、プレースホルダーの代わりに使用する変数名を指定してから、変数に対してすべての作業を行うというものです。

コードは次のようになります。

$insertsql = "INSERT INTO Session (SessionId, SessionTime, SessionDate, SessionWeight, SessionDuration, TotalMarks, ModuleId, TeacherId, Room) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);
$insert = $mysqli->prepare($insertsql);

$insert->bind_params("sssssssss", $sessid, $_SESSION['timeChosen'], $sessdate,
                     $_SESSION['textWeight'], $time, $_SESSION['textMarks'],
                     $_SESSION['module'], $teacherid, $_SESSION['rooms']);

for ($i = 1, $n = $_SESSION['sessionNum']; $i <= $n; ++$i) {
    $sessid = $_SESSION['id'] . ($n == 1 ? '' : $i);
    $sessdate = date("Y-m-d", strtotime($_SESSION['dateChosen']));

    $insert->execute();
}

$insert->close(); /* free resources */
于 2012-06-13T23:20:30.827 に答える