2016-03-19 8 views
0

Я пытаюсь обновить эту базу данных, и я проверил в этом скрипте, что обновление завершено, и что переменные $ nw и $ p верны.База данных не будет обновляться после переключения скрипта

<?php 
session_start(); 
$num = (int) $_SESSION["cart"]; 
$cart = $num + 1; 
$_SESSION["cart"] = (string) $cart; 
$nme = $_POST['nameofitem']; 
$pst = $_SESSION["user"]; 
$db = new mysqli('localhost', 'spj916', "cs4501", 'spj916'); 
$query = "select * from Items where Items.Id = '$nme'"; 
$result = $db->query($query) or die ($db->error); 
$item = $result->fetch_array(); 
$nw = $item[5] - 1; 
$p = (int) $pst; 
echo $p; 
$query3 = "update Items set Quantity = '$nw' where Id = '$p'"; 
$db->query($query3) or die ("Invalid insert " . $db->error); 
$query2 = "insert into Bought (Name, Cost, BuyerID) values ('$item[1]', '$item[4]', '$pst')"; 
$db->query($query2) or die ("Invalid insert " . $db->error); 
header("Location: store.php"); 
?> 

Однако, когда он перенаправляет этот сценарий, он перекликается с информацией, как если бы она не обновлялась. В чем проблема?

<?php 
session_start(); 
$db = new mysqli('localhost', 'spj916', "cs4501", 'spj916'); 
$user = $_SESSION["user"]; 
$pw = $_SESSION["pw"]; 
# determines number of items in cart to display 
if (!isset($_SESSION["category"])) 
    $_SESSION["category"] = "Book"; 
if (isset($_POST["Ccategory"])) { 
    $cat = $_POST["Ccategory"]; 
    $_SESSION["category"] = $cat; 
} 
if (!isset($_SESSION["cart"])) 
    $_SESSION["cart"] = "0"; 
$cart = $_SESSION["cart"]; 
?> 
<!DOCTYPE html> 
<html> 
<?php # setting up table with items to buy ?> 
<table border = "1" border-spacing = "5px" > 
<caption><h2> UVA Bookstore 2.0</h2> 
<p align=right> Items in cart: <?php echo $cart?> </p> <br /> 
    <b><i>Welcome to the new and improved bookstore with a better selection than ever</i></b> 
    <br/><br/> 
</caption> 
<tr align = "center"> 
    <th>Item</th> 
    <th>Description</th> 
    <th>Price</th> 
    <th>Number left</th> 
    <th>Buy</th> 
</tr> 
<?php 
    $category = $_SESSION["category"]; 
    $query = "select * from Items where Items.Category = '$category'"; 
    $result = $db->query($query) or die ($db->error); 
    $rows = $result->num_rows; 
    for ($i = 0; $i < $rows; $i++) 
    { 
    $row = $result->fetch_array(); 
?> 
    <form action="addtocart.php" 
       method="POST"> 
     <tr align = "center"> 
     <td> 
<?php 
     echo $row[1]; 
?> 
     </td> 
     <td> <?php echo $row[3];?> </td> 
    <td> <?php echo $row[4];?> </td> 
    <td> <?php echo $row[5];?> </td> 
    <?php # sets up add to cart button that adds item to cart ?> 
     <td> <input type = "hidden" name ='nameofitem' 
          value= "<?php echo $row[0]?>"> 

       <input type='submit' value='Add to Cart'> </input> </td> 
     </tr> 
    </form> 
<?php 
    } 
# form to check out and go to summary page ?> 
<form action = "store.php" 
     method = "POST"> 
<tr align = "center"> <td> 
<select name = "Ccategory"> 
    <option value = "Book">Books</option> 
    <option value = "Music">Music</option> 
    <option value = "Car">Cars</option> 
</select> 
<input type = "hidden" name = "cat"> </td> 
<td> <input type = "submit" value = "Switch Category"> </td> 
</form> 
<form action="summary.php" 
     method="POST"> 
    <td> <input type = "submit" value = "Check out"> </td> </tr> 
</table><br/> 
</form> 
</html> 
+2

Этот код подвержен уязвимостям SQL Injection. Проект OWASP предоставляет полезную информацию ... [https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet] (https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet) – spencer7593

+0

Я действительно не знаю понимаю это. Можете ли вы сказать мне, что я сделал не так? У меня есть серьезные ограничения времени. –

+1

«Я проверил в этом скрипте, что обновление завершено, и что переменные $ nw и $ p верны»: перед выполнением запроса на обновление вы переводите значение «$ p». Как вы подтвердили, что обновление в порядке? посмотрите на phpmyadmin, чтобы узнать, действительно ли значение поля действительно обновлено. – fusion3k

ответ

0

Вы пробовали изменения

$query3 = "update Items set Quantity = '$nw' where Id = '$p'"; 

в

$query3 = "update Items set Quantity = '$nw' where Id = $p"; 

Лучший способ определить, если UPDATE должен работать, чтобы заменить его SELECT, содержащим тот же WHERE пункт. Таким образом, вы можете увидеть, какие строки будут изменены, если вы хотите запустить исходный запрос.

В противном случае, похоже, что ваши изменения в текущей транзакции никогда не выполняются. Это единственный скрипт, который имеет проблемы с обновлениями в базе данных? Пожалуйста, смотрите Руководство по PHP для получения дополнительной информации:

//mysqli::commit -- mysqli_commit — Commits the current transaction 
bool mysqli::commit ([ int $flags [, string $name ]]) 

Коммит должно быть выдано, когда вы закончите делать все обновления, которые имеют зависимости (или для тех, которые являются атомарными), однако, вы не всегда должны совершать в зависимости от конфигурации вашего сервера. Кроме того, похоже, что у вашего скрипта есть уязвимости SQL-инъекций, о чем говорили другие. Было бы лучше всего использовать подготовленные заявления или дезинформировать ваши материалы.

+0

Я могу вставить элементы в базу данных, но это единственный скрипт, в котором я пытаюсь обновить строку. –

+0

Откуда вы знаете, что строка обновляется? Вы не можете получить сообщение об ошибке, но это может быть так, что ваше предложение '' WHERE''' не соответствует чему-либо. Честно говоря, я думаю, это потому, что вы обрабатываете '' '$ p''' как строку в своем запросе вместо целого. Является ли '' '' '' '' 'должен быть строкой? Вероятно, это ваша проблема; просто удалите одинарные кавычки. – CzechErface

+0

Вы могли решить проблему? Мне хотелось бы получить обратную связь. – CzechErface

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