“警告:mysqli_fetch_assoc()期望参数1为mysqli_result,boolean给出”

时间:2013-05-11 00:58:00

标签: php jquery mysql ajax mysqli

我收到的错误如下:

  

警告:mysqli_fetch_assoc()要求参数1为mysqli_result,第45行/Applications/MAMP/htdocs/live/vote_process.php中给出布尔值

当我喜欢(竖起大拇指)内容或文章并且数据库表中的记录永远不会更新时,会显示此错误。但是,当我不喜欢(竖起大拇指)内容或文章时,错误永远不会出现。

不喜欢(拇指朝下)记录会在您不喜欢时显示在页面上,但一旦刷新页面就会显示0。有没有更好的方法来纠正这个?以下是我的代码:

PHP代码

<?php
if ($_POST) {
    ### connect to mySql
    $sql_con = mysqli_connect($db_host, $db_username, $db_password, $db_name) or die('could not connect to database');

    //get type of vote from client
    $user_vote_type = trim($_POST["vote"]);

    //get unique content ID and sanitize it (cos we never know).
    $music_id       = filter_var(trim($_POST["music_id"]), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);

    //Convert content ID to MD5 hash (optional)
    $music_id       = hash('md5', $music_id);

    //check if its an ajax request, exit if not
    if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
        die();
    }

    switch ($user_vote_type) {

        ##### User liked the content #########
        case 'up':
            //check if user has already voted, determined by unique content cookie
            if (isset($_COOKIE["voted_" . $music_id])) {
                header('HTTP/1.1 500 Already Voted'); //cookie found, user has already voted
                exit(); //exit script
            }
            //get vote_up value from db using music_id
            $qur            = mysqli_query($sql_con, "SELECT like FROM music_like WHERE music_id='$music_id' LIMIT 1");
            $get_total_rows = mysqli_fetch_assoc($qur);
            if ($get_total_rows) {
                //found record, update vote_up the value
                mysqli_query($sql_con, "UPDATE music_like SET like=like+1 WHERE music_id='$music_id'");
            } else {
                //no record found, insert new record in db
                mysqli_query($sql_con, "INSERT INTO music_like (music_id, like) value('$music_id',1)");
            }
            setcookie("voted_" . $music_id, 1, time() + 7200); // set cookie that expires in 2 hour "time()+7200".
            echo ($get_total_rows["like"] + 1); //display total liked votes
            break;

        ##### User disliked the content #########
        case 'down':
            //check if user has already voted, determined by unique content cookie
            if (isset($_COOKIE["voted_" . $music_id])) {
                header('HTTP/1.1 500 Already Voted this Content!'); //cookie found, user has already voted
                exit(); //exit script
            }
            //get vote_up value from db using unique_content_id
            $qur            = mysqli_query($sql_con, "SELECT dislike FROM music_like WHERE music_id='$music_id' LIMIT 1");
            $get_total_rows = mysqli_fetch_assoc($qur);
            if ($get_total_rows) {
                //found record, update vote_down the value
                mysqli_query($sql_con, "UPDATE music_like SET dislike=dislike+1 WHERE music_id='$music_id'");
            } else {
                //no record found, insert new record in db
                mysqli_query($sql_con, "INSERT INTO music_like (music_id, dislike) value('$music_id',1)");
            }
            setcookie("voted_" . $music_id, 1, time() + 7200); // set cookie that expires in 2 hour "time()+7200".
            echo ($get_total_rows["dislike"] + 1); //display total disliked votes
            break;

        ##### respond votes for each content #########
        case 'fetch':
            //get vote_up and vote_down value from db using unique_content_id
            $qur           = mysqli_query($sql_con, "SELECT like, dislike FROM music_like WHERE music_id='$music_id' LIMIT 1");
            $row           = mysqli_fetch_assoc($qur);

            //making sure value is not empty.
            $like          = ($row["like"]) ? $row["like"] : 0;
            $dislike       = ($row["dislike"]) ? $row["dislike"] : 0;

            //build array for php json
            $send_response = array(
                'like' => $like,
                'dislike' => $dislike
            );

            echo json_encode($send_response); //display json encoded values
            break;
    }
}
?>

JQUERY CODE

$(document).ready(function() {

    //####### on page load, retrive votes for each content
    $.each( $('.voting_wrapper'), function(){

    //retrive music_id from this voting_wrapper element
    var music_id = $(this).attr("id");

    //prepare post content
    post_data = {'music_id':music_id, 'vote':'fetch'};

    //send our data to "vote_process.php" using jQuery $.post()
    $.post('vote_process.php', post_data, function(response) {

    //retrive votes from server, replace each vote count text
    $('#'+music_id+' .like').text(response.like);
    $('#'+music_id+' .dislike').text(response.dislike);
    },'json');
    });

    //####### on button click, get user vote and send it to vote_process.php using jQuery $.post().

    $(".voting_wrapper .voting_btn").click(function (e) {

        //get class name (down_button / up_button) of clicked element
        var clicked_button = $(this).children().attr('class');

        //get unique ID from voted parent element
        var music_id = $(this).parent().attr("id");

        if (clicked_button === 'down_button') //user disliked the content
        {
            //prepare post content
            post_data = {
                'music_id': music_id,
                'vote': 'down'
            };

            //send our data to "vote_process.php" using jQuery $.post()
            $.post('vote_process.php', post_data, function (data) {

                //replace vote down count text with new values
                $('#' + music_id + ' .dislike').text(data);

                //thank user for the dislike
                alert("Thanks! Each Vote Counts, Even Dislikes!");

            }).fail(function (err) {

                //alert user about the HTTP server error
                alert(err.statusText);
            });
        }
        else if (clicked_button === 'up_button') //user liked the content
        {
            //prepare post content
            post_data = {
                'music_id': music_id,
                'vote': 'up'
            };

            //send our data to "vote_process.php" using jQuery $.post()
            $.post('vote_process.php', post_data, function (data) {

                //replace vote up count text with new values
                $('#' + music_id + ' .like').text(data);

                //thank user for liking the content
                alert("Thanks! For Liking This Content.");
            }).fail(function (err) {

                //alert user about the HTTP server error
                alert(err.statusText);
            });
        }
    });
    //end
    });

1 个答案:

答案 0 :(得分:3)

LIKE reserved word 。因此,当您使用保留字作为对象名称(列,表等)时,请始终在查询中使用反向标记。

E.g。你需要改变

SELECT like FROM music_like WHERE music_id='$music_id' LIMIT 1

SELECT `like` FROM music_like WHERE music_id='$music_id' LIMIT 1
       ^    ^

同样在这里:

UPDATE music_like SET like=like+1 WHERE music_id='$music_id'

应该是

UPDATE music_like SET `like`=`like`+1 WHERE music_id='$music_id'

并且

SELECT like, dislike FROM music_like WHERE music_id='$music_id' LIMIT 1

SELECT `like`, dislike FROM music_like WHERE music_id='$music_id' LIMIT 1

如果不这样做,您的查询将无效。因为mysqli_query()失败并返回布尔FALSE而不是资源。这就是mysqli_fetch_assoc()因您发布的错误消息而失败的原因。