2016-03-19 14 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インジェクションの脆弱性の影響を受けます。 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が動作するかどうかを決定するための最良の方法は、同じWHERE句を含むSELECTと交換することです。この方法で、元のクエリを実行する場合にどの行が変更されるかを確認できます。

そうしないと、現在のトランザクションの変更が決してコミットされない場合があります。これは、データベースの更新に問題がある唯一のスクリプトですか?詳細については、PHPマニュアルを参照してください。

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

Aはあなたが依存関係(またはアトミックあるもののため)を持っているすべての更新をして行われたときに発行されるべきコミット、しかし、あなたは常にコミットする必要はありません。サーバーの構成によって異なります。また、あなたのスクリプトには他にも言及しているようにSQLインジェクションの脆弱性があるようです。準備されたステートメントを使用するか、入力をサニタイズするのが最善でしょう。

+0

私は要素をデータベースに挿入できますが、これは行を更新しようとする唯一のスクリプトです。 –

+0

行が更新されていることをどのように知っていますか?エラーは出ないかもしれませんが、 '' 'WHERE'''節が何もマッチしていない場合があります。正直なところ、私はあなたが '' $ p''を整数ではなくクエリの文字列として扱っているからです。 '' '' Id''は文字列であるはずですか?それはおそらくあなたの問題です。一重引用符を削除するだけです。 – CzechErface

+0

問題を解決できましたか?私はいくつかのフィードバックをお願いします。 – CzechErface

関連する問題