当复选框条件改变时如何使用ajax更新mysql数据库?

3

我有一张文章表格,客户端以行显示。每篇文章都有一个唯一的ID,并包含一个复选框,用于指示该文章是否被标记为收藏。如果是收藏的,那么复选框已经被选中。如果没有,它就未被选中。现在,我需要使用js或jquery和ajax来更新数据库中的表格,当且仅当每行的复选框状态发生变化时。另一个挑战是我正在工作在cakePHP MVC环境中。

<script type="text/javascript" src="jquery-1.2.1.min.js"></script>
<script type="text/javascript">

    function checkbox_click (id, favorite)
    {
        // see if checkbox is checked
        if(favorite==1)
        {
            $.ajax({
                type:'POST',
                url:'check_favorite.php', // this external php file isn't connecting to mysql db
                data:'id= ' + id + '&amp;favorite=1',
            });
        }// if
        // the checkbox was unchecked
        else
        {
            $.ajax({
                type:'POST',
                url:'check_favorite.php', // this external php file isn't connecting to mysql db
                data:'id= ' + id + '&amp;favorite=0',
            });
        }//else
    }
</script>

--html-- 这是在一个foreach循环中。

echo "<input type='checkbox' id='$rowid;' name='favorite' checked='checked' onclick='checkbox_click('id','favorite',this();' />";


else
echo "<input type='checkbox' id='$rowid;' name='favorite'  onclick='checkbox_click('id','favorite',this.checked);' />";

--通过AJAX调用的PHP文件--
<?php
//Database Variables - with the variables entered it doesn't connect
$dbhost = 'localhost';   // usually localhost
$dbuser = 'username';      // database username
$dbpass = 'password';      // database password

//Establish connection to MySQL database

$con = @mysql_connect($dbhost, $dbuser, $dbpass);
if (!$con)
die('Unable to connect.' . mysql_error());

mysql_select_db('devcake', $con);

// Get the variables.
$query = "UPDATE mytable SET favorite=".$_POST['favorite'] . "
WHERE id=".$_POST['id'] . ";";

mysql_query($query);
mysql_close($con);
?>

这里到底是哪里出了问题?另外,当粘贴代码时,请尝试格式化并放置在代码块中,否则它会变得完全无法阅读。 - Jordan Brown
1
这里没有一点点的CakePHP,你需要在book.cakephp.org上多了解一下并学习一些ajax。 - Dunhamzzz
目前控制器助手数组中没有cakePHP,因为当我将其添加到其中时,它会破坏分页...然后我尝试以另一种方式连接到mysql数据库。代替ajax url去外部php页面,它需要去控制器吗? - sloga
3个回答

5
这是我使用的代码(感谢Samuel)
 $('input[name=favorite]').live("click",function(){
    var id    = $(this).attr('id');

    if($(this).attr('checked')) {
        var favorite = 1;
    } else {
        var favorite = 0;
    }

    $.ajax({
        type:'GET',
        url:'favorites.php',
        data:'id= ' + id + '&favorite='+favorite
    });
    //console.log('id: ' + id + ' Publico: '+publico + 'Value: '+value);

 });

1

这有点棘手!

首先,让我们优化一下HTML。默认情况下,复选框在被选中时会发送值“on”(除非您在输入标记中指定了value,但您没有这样做)。请完全删除onClick事件,因为我们将使用jQuery来简化事情并更好地分离行为和呈现。

其次,让我们正确设置您的php文件。如果您实际上没有修改用户名和密码,则它们的值可能实际上应该是

$dbhost='localhost';
$dbuser='root';
$dbpass='';

一旦连接正常,我们需要修复处理发布数据的方式。我喜欢将其提取到单独的变量中,这样,如果出现问题,我只需执行print variable;并查看它是否有值。

在您的php文件中获取发布的数据并查询它的更好方法如下:

$id=$_POST['id'];
$favorite=$_POST['favorite'];
$query="UPDATE mytable SET favorite='$favorite' WHERE id='$id'";

这段代码的作用是将“favorite”列的值更改为“on”或“”。因此,请转到实际输出复选框的位置,并插入一些PHP代码来检查数据库中是否已经选中该复选框。就像这样。
 echo "<input type='checkbox' id='$rowid;' name='favorite'";
if(//check in database if 'favorite' column is set to 'on'){
print "checked='checked'";
 }
    echo "/>";

请注意缺少onClick事件。我们将使用jquery来处理它。
    $('input[name=favorite]').click(function(){
    //if a checkbox with name 'favorite' is clicked, do the following.
    //grab the id from the clicked box
    var id=$(this).attr('id');
    //grab the value from the checkbox (remember, if it is checked it will be 'on', else ''
    var favorite=$(this).val();
    //setup the ajax call
    $.ajax({
            type:'POST',
            url:'check_favorite.php',
            data:'id= ' + id + '&favorite='+favorite
        });
    }
    });

好了,终于完成了。我想这应该解决了一些问题,如果不是全部的话。


为什么是'on'?我需要将值写入数据库,要么是1,要么是0。 - sloga
@samuel.. 是否有语法错误?我注意到缺少了 <script type="text/javascript"> jQuery(function($){,但点击时仍然似乎得不到响应。我也尝试了 pr $favorite,但没有任何输出...想看看它是否打印出 1 或 0 或 on 或者 "。 - sloga
当复选框被选中时,它所发送的默认值是 "on"。如果你想在其进入数据库前更改它,可以使用 if(checkbox='on) 进行逻辑检查,将 checkbox 改为 '1',否则改为 '0' (伪代码 :P)如果你无法确定 JavaScript 中出现问题的位置,请尝试添加一些 alert('GOT HERE'); 语句。我通常这样做来找出我的逻辑在哪里出了问题,或者在哪里得到执行。这能解释清楚吗? - samuel
只是一个想法,如果通过单击<label>来选中复选框,这是否有效? - Adam
我还没有检查过。虽然我认为对于他的目的来说,它只是一个独立的框,在一列中。我会调查一下,因为以后知道这个信息会很有用。 - samuel

0

将您的回显语句更改为以下内容,然后尝试并让我知道结果如何:

echo "<input type='checkbox' id='$rowid;' name='favorite' checked='checked' onclick='checkbox_click('$rowid','favorite',this();' />";

else
echo "<input type='checkbox' id='$rowid;' name='favorite'  onclick='checkbox_click('$rowid','favorite',this.checked);' />";

在PHP中,如果你想检查复选框是否被选中,可以这样做:echo ( isset($_POST['favorite']) ) ? '是' : '否'; 只需将“是”和“否”更改为您想要的值即可。 - Devner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接