2016-12-05 4 views
0

У меня есть простая страница формы html, которая должна обновлять 2 значения столбца, где «Some_DB_Table». Id = введенный пользователем номер идентификатора. Тем не менее, я немного зациклен на том, как это сделать, используя подготовленные инструкции, чтобы избежать SQL Injection.обновить строку MySQL DB, используя значения формы в PHP

МОЙ КОД:

HTML:

<form id="workorderMovement" name='workorderMovement_form' action="workordermovementGET.php" method="post"> 



<fieldset id="userid"> 

    <span>Welcome <?php echo $user ?> </span> 

</fieldset> 




<fieldset id="sgnum"> 

<fieldset id="fieldset" style="text-align: center;"> 
    <span>Please enter the SG Number</span> 
</fieldset> 

<input type="text" name="sgnumber" id="sgnumber"> &nbsp;&nbsp;&nbsp; <input type="button" name="searchButton" id="searchButton" value="SEARCH"> 

</fieldset> 


<br/> 
<br/> 



<fieldset id="stageSelectField"> 

    <fieldset id="fieldset" style="text-align: center;"> 
    <span>Please select the Stage Completed</span> 
    </fieldset> 

<select name="stageSelect" id="stageSelect"> 
    <option value="Please Select">Please Select</option> 
    <option value="Film Done">Film Done</option> 
    <option value="Staged Done">Staged Done</option> 
    <option value="Cleanroom Done">Cleanroom Done</option> 
    <option value="GB2 Done">GB2 Done</option> 
    <option value="Bagging Done">Bagging Done</option> 
    <option value="Inspection Done">Inspection Done</option> 
    <option value="LC Done">LC Inspection Done</option> 
    <option value="IGU Done">IGU Done</option> 
</select> 

</fieldset> 


<br/> 
<br/> 


<fieldset id="floorNotesField"> 

    <fieldset id="fieldset" style="text-align: center;"> 
    <span>Please enter any new work order notes</span> 
    </fieldset> 

    <textarea type="text" name="floorNotes" id="floorNotes" class="floorNotesText"></textarea> 

</fieldset> 


<br/> 
<br/> 
<br/> 

</form> <!-- End Work Order Movement Form --> 

<fieldset id="doneButtonField"> 

    <input type="button" name="doneButton" id="doneButton" value="DONE"> 

</fieldset> 

МОЯ АЯКС:

j("#doneButton").click(function(){ 


//send Workorder Movement Data values to php using ajax. 

var sgnumber = j('#sgnumber').val(); 
var stageselect = j('#stageSelect').val(); 
var floornotes = j('#floorNotes').val(); 
j.ajax ({ 
    method: 'POST', 
    url: "workordermovementUPDATE.php", 
    data: {sgNumber: sgnumber, stageSelect: stageselect, floorNotes: floornotes}, 
    dataType: 'json', 
    success: function(data){ 
     alert(data); 
    } 
    }); 

}); 

МОЯ PHP:

<?php 


include('inc.php'); 


//Get Table Options. 
if (isset($_POST['sgNumber'])) { 
    $sgNumber = $_POST['sgNumber']; 

    if (isset($_POST['stageSelect'])) { 
     $stageSelect=$_POST['stageSelect']; 
    } 
    if (isset($_POST['floorNotes'])) { 
     $floorNotes=$_POST['floorNotes']; 
    } 

    //connect to the database 
    $conn = new mysqli($servername, $username, $password, $dbname); 

    // Check connection 
    if(mysqli_connect_errno()) { 
     printf('Could not connect: ' . mysqli_connect_error()); 
     exit(); 
    } 

    $conn->select_db($dbname); 

    if(! $conn->select_db($dbname)) { 
     echo 'Could not select database. '.'<BR>'; 
    } 

    $sql= "UPDATE invoices SET productionstage = ".$stageSelect.", floornotes = ".$floorNotes." WHERE id = ?"; 
    $stmt = $conn->prepare($sql); 
    $stmt->bind_param('i', $sgNumber); 
    $stmt->execute(); 
    $stmt->store_result();  

    if(mysqli_query($conn, $stmt)){ 
     echo "".$sgnumber." Updated Successfully!"; 
    } else { 
     echo "ERROR: Could not update ".$sgnumber."".mysqli_error($conn).""; 
    } 


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 


//Free the result variable. 
$result->free(); 


//Close the Database connection. 
$conn->close(); 

}//End If statement 

?> 

Правильно ли это/какие-либо предложения?

Спасибо!

+1

Поскольку вы готовите вещи и делаете вызов 'bind_param', я не уверен, как вы полностью пропустили лодку, помещая в заполнители ** все значения **, а не только некоторые произвольные. Что там делает '$ stageSelect'? Замените все на '?' И привяжите эти значения. – tadman

+0

@tadman, так что-то вроде: $ sql = "UPDATE invoices SET productionstage =?, Floornotes =? WHERE id =? ' а затем выполните $ stmt-> bind_param ('i', $ sgNumber, $ stageSelect, $ floorNotes);? Я не уверен, как сделать часть bind_param, чтобы избежать SQL-инъекции при обновлении таблицы, а не просто отбирать данные из нее. – rdimouro

ответ

2

Если вы внимательно прочитали the documentation on bind_param, вы увидите, что вам нужно указать тип каждого параметра. Обычно это не имеет большого значения:

$stmt = $conn->prepare(
    "UPDATE invoices SET productionstage=?,floornotes=? WHERE id = ?" 
); 
$stmt->bind_param('ssi', $stageSelect, $floorNotes, $sgNumber); 

Старайтесь избегать создания промежуточных переменных для операторов. Это часто приводит к ситуациям, когда вы случайно запускаете неправильный запрос.

+0

Итак, я протестировал обновление, подобное этому, и мой столбец productionstage обновляется правильно, но floornotes этого не делает. Тип столбца floornotes - это текст, поэтому я установил свой param_bind типа as 's' следующим образом: 'ssi', и мой фактический текст просто говорит ' test ', но когда я повторю поиск, поле возвращает пустое, и я вижу в базе данных, что столбец для строки также пуст. Я также не получаю никаких ошибок ... тип данных для столбца productionstage -' varchar Я могу решить проблему с параметром param_bind и текстом столбца? – rdimouro

+1

Огромное вам спасибо! Я смог решить проблему. Оказывается, мой редактор кода и мой сервер испытывают трудности с записью, которые блокировали некоторые мои изменения из на сервере. После исправления все сработало отлично. – rdimouro