【问题标题】:PHP, Ajax Infinite Scroll converting code from Mysqli to PDOPHP,Ajax Infinite Scroll 将代码从 Mysqli 转换为 PDO
【发布时间】:2017-09-27 11:35:06
【问题描述】:

我正在尝试将 Mysqli 代码转换为我在互联网上找到的 Ajax 无限滚动系统的 PDO,因此我可以将其添加到我为学习 php 制作的博客中。 这是原始的 ajax.php 文件:

 if( isset( $_POST['start'] ) && isset( $_POST['limit'] ) && !empty( $_POST['start'] ) && !empty( $_POST['limit'] ) ){
    $start = $_POST['start'];
    $limit = $_POST['limit'];
    $query = "SELECT * FROM timeline limit $start, $limit";
    $result = mysqli_query($con, $query) or die('Error: ' . mysqli_error($con));
    $data = array();
    $rowcount = mysqli_num_rows($result);
    $data['count'] = $rowcount;
    while($row = mysqli_fetch_assoc($result)) {
        $data['content'][] = $row;
    }
    mysqli_close($con);
    echo json_encode($data);exit;   
}

这是我的尝试,对我来说一切都很好,但仍然无法正常工作,所以我想我搞砸了一些 PDO 函数...

    if( isset( $_POST['start'] ) && isset( $_POST['limit'] ) && !empty( $_POST['start'] ) && !empty( $_POST['limit'] ) ){
    $start = $_POST['start'];
    $limit = $_POST['limit'];
    $stmt = "SELECT * FROM timeline limit $start, $limit";
    $data = array();
    $rowcount = $stmt->fetchAll(); 
    $data['count'] = $rowcount;
    foreach ($db->query($stmt) as $row) {
    $data['content'][] = $row;
}
echo json_encode($data);
}

我知道我应该使用 PDO 准备好的语句,我会,但首先我想让它按原样工作......

这里是 Ajax script.js 本身:

flag = true;
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == $(document).height()){
first = $('#first').val();
limit = $('#limit').val();
no_data = true;
if(flag && no_data){
    flag = false;
    $('#loader').show();
    $.ajax({
        url : 'ajax.php',
        dataType: "json",
        method: 'post',
        data: {
           start : first,
           limit : limit
        },
        success: function( data ) {
            flag = true;
            $('#loader').hide();
            if(data.count > 0 ){
                first = parseInt($('#first').val());
                limit = parseInt($('#limit').val());
                $('#first').val( first+limit );
                $('#timeline-container');
                $.each(data.content, function(key, value ){

                    if(value.event!=''){
                    html = '<li class="timeline-item">';
                    html += '<div class="timeline-badge" data-
                    toggle="popover" data-placement="left" data-
                    trigger="hover" data-
                    content="Mention"><a href="#"></a></div>';
                    html += '<div class="timeline-panel">';
                    html += '<div class="timeline-heading">';
                    html += '<p>This is the new post: </p>';
                    html += '<div class="timeline-date"><i class="fa fa-
                    calendar-o"></i> '+value.date+'</div>';
                    html += '</div>';
                    html += '<div class="timeline-content">';
                    html += '<p>'+value.post+'</p>';
                    html += '</div>';
                    html += '</li>';
                    }

                    $('#timeline-container').append( html );

                    $('.timeline-item').waypoint({
                        triggerOnce: true,
                        offset: '80%',
                        handler: function() {
                            jQuery(this).addClass('animated fadeInUp');
                        }
                    });
                });
            }else{
                alert('No more data to show');
                no_data = false;
            }
        },
        error: function( data ){
            flag = true;
            $('#loader').hide();
            no_data = false;
            alert('Something went wrong, Please contact admin');
        }
    });
}

} });

这是我的配置文件,以备不时之需...提前感谢大家!

define('DBHOST','localhost');
define('DBUSER','root');
define('DBPASS','');
define('DBNAME','my_db');

$db = new PDO("mysql:host=".DBHOST.";charset=utf8;dbname=".DBNAME, DBUSER, 
DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

define('FIRST', 4);
define('LIMIT', 4);

【问题讨论】:

  • 查询前无法获取
  • 也试过用查询,还是不行...
  • $rowcount = $stmt-&gt;fetchAll(); 应该会导致错误。 $stmt 是字符串,不是 PDO 语句。
  • @Fred-ii- 也试过这样: $stmt = $db->query("SELECT * FROM timeline limit $start, $limit"); $数据 = 数组(); $rowcount = $stmt->fetchAll(); $data['count'] = $rowcount;

标签: php jquery ajax mysqli pdo


【解决方案1】:

这一行完全错误:

$rowcount = $stmt->fetchAll(); 

$stmt 是字符串,不是 PDO 对象,你不能在上面调用fetchAll()。而fetchAll() 返回结果的所有行,而不是计数。

if( isset( $_POST['start'] ) && isset( $_POST['limit'] ) && !empty( $_POST['start'] ) && !empty( $_POST['limit'] ) ){
    $start = $_POST['start'];
    $limit = $_POST['limit'];
    $data = array();
    $stmt = $db->prepare("SELECT * FROM timeline limit :start, :limit";
    $stmt->execute(array(':start' => $start, ':limit' => $limit));
    $data['content'] = $stmt->fetchAll(); 
    $data['count'] = count($data['content']);
}
echo json_encode($data);

【讨论】:

  • 谢谢你的回答,但还是不行,嗯,我正在这样那样尝试,但仍然......
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多