2016-04-27 164 views
0

我有一個項目的4個圖像列表。 其中一個應顯示在另一個頁面中,作爲從該頁面到項目頁面的鏈接。無法使用複選框數據更新數據庫

我希望能夠檢查一個盒子,以便這個盒子將成爲主要的圖片,並將顯示在類別頁面中。

這是形式的代碼:

$all_pics_of_item = fetch_all_pics_of_item($item_id); 
//print_r($all_pics_of_item); 
if(is_array($all_pics_of_item)) 
{ 
    echo '<ul>'; 
    foreach($all_pics_of_item as $key=>$val) 
    { 
     if ($val['pics_main']=='yes') 
     { 
     $set_checked = "checked"; 
     $action = true; 
     } 
     else 
     { 
     $set_checked = ""; 
     $action = false; 
     } 
     echo '<li style="float: left;margin:10px;border: 1px solid #000;padding:10px;">'; 
     echo '<img style="width:120px;height:120px;" src="../../gallery_images/thumbs/'.$val['pics_source'].'">'; 
     echo '<br>'.$val['pics_name']; 
     echo '<br><a href="delete_pic.php?picsrc='.$val['pics_source'].'&picid='.$val['pics_id'].'&iid='.$item_id.'"><div class="delet"><b>x</b></div></a>'; 
     echo '<br><form method="post" action="update_main_pic.php" enctype="text/plain" > 
       Show in cat. page<input type="checkbox" class="myCheckbox" name="main" value="no"'.$set_checked.'&action='.$action.' data-picid="'.$val['pics_id'].'" data-itemid="'.$item_id.'" /> 
       </form>'; 
     echo '</li>'; 
    } 
    echo '<ul>'; 
} 

這裏是AJAX和腳本:

$(document).ready(function(){ 

$(':checkbox').click(function() { 
    $(':checkbox').not(this).removeAttr('checked'); 

    var picid = $(this).attr('data-picid'); 
    var itemid = $(this).attr('data-itemid'); 
    var action = $(this).is(':checked'); 
    //if((this).attr('checked',true)) 
    //{ 
    // var action = true; 
    //} 
    //else 
    // { 
    //  var action = false; 
    // } 


    $.ajax({ 
     url: "ajax_update_main_pic.php", 
     type: "POST", 
     data: "itemid=" + itemid + "&picid=" + picid + "&action=" + action, 
     timeout:5000, 
     dataType: "html", 
     beforeSend:function(){ 


     }, 
     error: function(){ 
      alert('Problem !'); 
     }, 
     success: function(msg){ 
      if(msg == 'no') 
      { 

      } 
      else 
      { 

      } 

     }, 
     complete: function(){ 

     } 
    }) 

}); 

}); //END READY 

這裏是更新的功能:

<?php 

require_once "../../db.php"; 
require_once "../../functions.php"; 

if(isset($_POST['itemid']) && isset($_POST['picid']) && isset($_POST['action'])) 
{ 
$item_id = $_POST['itemid']; 
$pic_id = $_POST['picid']; 
$action = $_POST['action']; 
} 
else 
{ 
header('location: upload_image.php'); 
    die(); 
} 


if($action == 'true') 
{ 
$pic_show = 'yes'; 
} 
else 
{ 
$pic_show = 'no'; 
} 
//print_r($pic_show); 
function update_main_pic($item_id, $pic_id, $pic_show) 

{ 
    global $db; 

    try 
    { 
     $sql = " 
       UPDATE pics SET 
       pics_main = :pic_show 
       WHERE pics_id = :pic_id AND pics_items_id = :item_id 

       ";  

     $stmt = $db->prepare($sql); 
     $stmt->bindParam(':pics_id', $pic_id, PDO::PARAM_INT); 
     $stmt->bindParam(':pics_items_id', $item_id, PDO::PARAM_INT); 
     $stmt->bindParam(':pics_main', $pic_show, PDO::PARAM_STR); 
     $stmt->execute(); 

     return true;  
    } 
    catch(Exception $e) 
    { 
     return false;   
    } 
} 



$result = update_main_pic($item_id, $pic_id, $pic_show); 

if($result == false) 
{ 
    die('Problem updating pics'); 
} 
else 
{ 
    header('location: upload_image.php?iid='.$item_id); 
    die(); 
} 

?> 

我總是得到'問題更新圖片'

它看起來像只有選中的複選框被傳輸,而我想的是,列PIC_MAIN會顯示「是」如果這是一個選擇和「無」敵我其他所有圖片

+0

什麼錯誤出現在'$ E->的getMessage()'?在catch中(Exception $ e)' – C2486

+0

你有:pic_show,:pic_id,:item_id作爲你的update_main_pic()中的一個命名參數,但是你沒有使用bindParam來做這件事嗎?你也綁定:pics_main但這不是在查詢本身? – Matt

回答

1

的問題與您捆綁。

您SQL具有以下名稱變量:pic_show:pic_id:item_id,但你有約束力:pics_main':pics_items_id:pics_id

更改綁定:

$sql = " 
     UPDATE pics SET 
     pics_main = :pic_show 
     WHERE pics_id = :pic_id AND pics_items_id = :item_id 

     ";  

    $stmt = $db->prepare($sql); 
    $stmt->bindParam(':pic_id', $pic_id, PDO::PARAM_INT); 
    $stmt->bindParam(':item_id', $item_id, PDO::PARAM_INT); 
    $stmt->bindParam(':pic_show', $pic_show, PDO::PARAM_STR); 
+0

感謝您的答案,數據庫更新,但我仍然有一個問題,該函數應該爲pic被選爲'pic_main'並同時給所有其他圖片的值'沒有'設置值'是'。 – Erez

+0

目前一張選定的圖片獲得值'是',並且當另一張圖片被檢查爲'pic_main'時,該值不會變爲'no',所以現在我有4張圖片設置爲'main',DB中的字段是'pics_id','pics name','pics_source','pics_main','pics_items_id'任何人都可以向我解釋$ stmt-> bindParam(':pic_show',$ pic_show,PDO :: PARAM_STR)的結構。這是什麼和它的功能,我似乎失去了一些東西。謝謝 – Erez

+0

bindParam基本上意味着準備好的語句和參數是分別執行的,只有在調用execute時纔會被執行,這就是安全性的來源。我將再次檢查所有代碼,看看發生了什麼。 – Matt