2014-11-05 194 views
1

這是我第一次使用預準備語句來更新MySQL。不知道我在哪裏出錯,但是當我點擊提交按鈕時,頁面刷新,實際上沒有任何更新生效。PHP準備好的語句不更新SQL數據庫

<?php session_start(); 

include_once("../includes/connection.php"); 
include_once("../includes/product.php"); 

$product = new Product; 
$products = $product->fetch_all(); 

if (isset($_SESSION['logged_in'])) { 

    if (isset($_GET['id'])) { 
    $id = $_GET['id']; 
    $sql_select = "SELECT * FROM products WHERE product_id = '{$id}'"; 
    $statement = $pdo->query($sql_select); 
    $r = $statement->fetch(PDO::FETCH_ASSOC); 
    } 

    if (isset($_POST['submit'])) { 
    if (isset($_POST['product_name'])) { $name = $_POST['product_name']; } 
    if (isset($_POST['product_avail'])) { $avail = $_POST['product_avail']; } 
    if (isset($_POST['product_price'])) { $price = $_POST['product_price']; } 
    if (isset($_POST['product_desc'])) { $desc = $_POST['product_desc']; } 
    if (isset($_POST['image'])) { $img = $_POST['image']; } 

    $sql_update = 'UPDATE products SET (product_name, product_avail, product_price, product_desc, image) 
    VALUES (:name, :avail, :price, :desc, :img) WHERE product_id = :id'; 

    $updstmt = $pdo->prepare($sql_update); 
    $updstmt->execute(array(
     ':id' => $id, 
     ':name' => $name, 
     ':avail' => $avail, 
     ':price' => $price, 
     ':desc' => $desc, 
     ':img' => $img)); 
    } 
?> 
    <?php include_once("../includes/header.php"); ?> 
     <h4>Edit product</h4> 
      <!-- call error if any required fields are empty --> 
      <?php if (isset($error)) { ?> 
       <small style="color:#aa0000;">* <?php echo $error; ?> 
      <?php } ?> 
      <form action="edit_test.php?id=<?php echo $_GET['id']; ?>" method="post"> 
       <small>Product Name</small><br /> 
        <input type="text" name="product_name" value="<?php echo $r['product_name']; ?>" <?php if (isset($error) && empty($_POST['product_name'])) { ?> class="error" <?php } ?>/> 
       <br /><br /> 
       <small>Available?</small> 
        <input type="text" name="product_avail" value="<?php echo $r['product_avail']; ?>" <?php if (isset($error) && empty($_POST['product_avail'])) { ?> class="error" <?php } ?>/> 
       <small>Price</small> 
       &#36;<input type="number" min="0.01" step="0.01" name="product_price" value="<?php echo $r['product_price']; ?>" <?php if (isset($error) && empty($_POST['product_price'])) { ?> class="error" <?php } ?>/> 
       <br /><br /> 
       <small>Product Description</small> 
        <textarea rows="20" cols="30" name="product_desc" <?php if (isset($error) && empty($_POST['product_desc'])) { ?> class="error" <?php } ?>><?php echo $r['product_desc']; ?> </textarea><br /><br /> 
      <br /><br /> 
       <small>Product Image</small> 
       <input type="text" name="image" value="<?php echo $r['image']; ?>" <?php if (isset($error) && empty($_POST['i'])) { ?> class="error" <?php } ?>/> 

       <input type="submit" value="POST" class="submit save"> 
      </form> 

      <br /><br /> 
      <small><a href="index.php">&larr; Back</a></small> 
     </div> 
    <?php include("../includes/footer.php"); ?> 
<?php 
} 
?> 

我哪裏錯了?

+3

你很容易受到[sql注入攻擊](http://bobby-tables.com)的影響。爲什麼在其他查詢中使用準備好的語句,而不是**第一個從產品查詢中選擇的語句? – 2014-11-05 20:25:42

+0

UPDATE沒有VALUES,它有SET;本週第二次。 – 2014-11-05 20:27:12

+0

如果沒有更新,那麼插入''UPDATE products SET'到'INSERT INTO products'很難說你想在這裏做什麼。 – 2014-11-05 20:32:50

回答

4

在與周杰倫的回答結合:

這是因爲該if (isset($_POST['submit'])) {的又您的提交按鈕沒有命名。

<input type="submit" value="POST" class="submit save"> 

所以將其更改爲

<input type="submit" value="POST" class="submit save" name="submit"> 

你的條件語句依賴於它,並沒有什麼語句內會因爲它的執行。

但是,如果不更新,然後做的,通過改變UPDATE products SET插入到INSERT INTO products,如果要確實INSERT而不更新。


添加$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);連接打開後發生錯誤。

旁註:錯誤報告只能在分期中完成,而不能生成。

+0

+1好抓! – 2014-11-05 21:05:09

+0

@JayBlanchard謝謝Jay。看起來令人不安的是,與您給出的答案一起,代碼不起作用,因此我立即檢查了條件語句和POST變量以及表單元素。我很高興這個問題得到了解決,*歡呼聲* – 2014-11-05 21:06:18

+0

我已經結束了好幾次,並沒有看到它。團隊合作FTW! – 2014-11-05 21:07:28

6

您的UPDATE聲明是錯誤的。它不應該使用VALUES

$sql_update = 'UPDATE products SET product_name = :name, product_avail = :avail, product_price = :price, product_desc = :desc, image = :img WHERE product_id = :id'; 

向您的頁面和SQL語句添加錯誤檢查可能會發現您的查詢錯誤。 始終打開代碼,並打開錯誤檢查代碼以刪除錯誤。

+1

本週第二場大聲笑 – 2014-11-05 20:27:31

+0

Yessir。他們似乎在波濤洶涌。 – 2014-11-05 20:28:00

+0

我敢打賭,他們都去同一個地方喝酒。 * hic!* – 2014-11-05 20:28:42