2016-04-27 165 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