如何通过通过AJAX传递的URL从mysql请求数据

时间:2015-12-07 17:12:37

标签: php jquery mysql ajax pdo

我正在创建一个页面显示产品列表,并希望能够按类别过滤,拥有页面,每页限制项目和排序顺序

在商店页面上我进行数据库调用以生成所有类别并将它们放在侧栏中。

然后单击/更改使用$('#form')序列化表单上的所有日期.serialize()然后将其传递给request_handler.php,它将返回正确的数据。

问题是,因为它是所有POST数据都没有URL引用所以人们将无法链接到他们选择的结果类似于 - http://www.asos.com/Men/Shirts/Cat/pgecategory.aspx?cid=3602#state=Rf989%3D6200%2C4885&parentID=Rf989&pge=0&pgeSize=36&sort=-1 你也无法来回走动,因为它全是AJAX。我或许可以用历史JS解决这个问题,但我不确定如何使用网址来获得所需的结果。

<?php

    // Database config file, db login settings
    require_once '../inc/dbconfig.php';

    try {
    // connect to database;
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt_all_results = $conn->prepare('SELECT * FROM films ORDER BY category ASC');
    $stmt_all_results->execute();

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>

    <form id="store">
      <ul>
        <?php
          $category = null;
          while($r = $stmt_all_results->fetch()){
            if ($category != $r['category']) {
              $category = $r['category'];
                echo '<li>
                  <label for="cat-' . $category . '">
                    <input type="checkbox" name="cat[]" id="cat-'. $category .'" value="' . $category . '">'
                    . $category .
                  '</label>
                </li>';
            }
          }
        ?>
      </ul>
    </form>

<div class="result"></div>

<?php
  // close try
  } catch(PDOException $e) {
    echo 'ERROR: ' . $e->getMessage();
  }
?>

<!-- LOAD JQUERY -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>

  function get_data(dat){
      $.post( "request_handler.php", dat)
      .done(function( data ) {
      $( ".result" ).html( data );
    });
  }

  $('li').change(function(){
      var dat = $('#store').serialize();
      get_data(dat);
  })

</script>

请求处理程序脚本

<?php

// Database config file
require_once '../inc/dbconfig.php';

$category =$_POST['cat'];

foreach ($category as $i){
    $options[] = "category='" . $i ."'";
}

$sql = "SELECT * FROM databse";

if (count($options)){
   $sql .= " WHERE " . implode(' OR ', $options);
}

try {
    // connect to database;
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt_all_results = $conn->prepare($sql);
    $stmt_all_results->execute();

    # default
    $get_pages = isset($_GET['page']) ? $_GET['page'] : 1;

    while($row = $stmt_all_results->fetch()) {
     $product_title = $row['title'];
     $product_image = $row['image_src'];
     $product_category = $row['category'];
     $product_id = $row['id'];
?>


<ul>
    <li>
        <img src="<?php echo $product_image; ?>">
        <h4><?php echo $product_title; ?></h4>
        <p><?php echo $product_category; ?></h4>
        <a href="product?id=<?php echo $product_id; ?>">More Info</a>
    </li>

</ul>

<?php
}
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}

?>

- 如果这篇文章令人困惑,请不要进行攻击,只是建议重写,因为我一整天都在寻找解决这个问题 - 谢谢

1 个答案:

答案 0 :(得分:0)

现在将php与html / js / css混合是不好的做法。必须有某种框架和模板(逻辑和数据表示的分离)。

应使用适当的工具(如angular.js,ember.js等)构建用于数据操作的交互式客户端应用程序。如果您尝试在原始JavaScript中使用,或者甚至使用jQuery,那么在开发和支持该应用程序时肯定会遇到很多。

如果您不想将自己与客户端框架混淆并且更喜欢oldschool方式,我建议您查看名为jqGrid的jQuery插件。它内置了排序,过滤,分页等功能,但无论如何你都必须在服务器端做很多工作。

此外,如果您希望在URL中传递排序/过滤/页码参数,您必须正确初始化网格,使用网格API设置这些参数,然后重新加载。

我强烈建议你尝试某种模板引擎。这将使您的代码更加清晰和一致。