2012-06-13 3 views
-1

Я просто хочу знать, что когда дело доходит до вставки данных в базу данных с помощью mysqli, если это лучший способ сделать это ниже или есть намного лучший способ?Является ли этот метод вставки правильным при использовании 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(); 
+6

Вы не используете подготовленные заявления ... Вы по-прежнему вручную избежать ввода. – nickb

+0

Я не поклонник подготовленных заявлений, но он делает код более читабельным! – powtac

+0

Может ли кто-нибудь показать небольшой пример использования подготовленного оператора для вставки? – user1394925

ответ

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 */ 
0

Лучше всего использовать PDO и использовать prepared запрос, к которому вы bind ваши ценности. Если у вас есть много значений для заполнения, вы можете просто использовать позиционные заполнители вместо именных.

<?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, но вы получите общую идею, и я уверен, что это сработает.;))

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