通过ajax调用加载mysqli php数据

Posted

技术标签:

【中文标题】通过ajax调用加载mysqli php数据【英文标题】:Load mysqli php data via ajax call 【发布时间】:2013-05-14 06:38:15 【问题描述】:

我想要做的是通过 ajax 和 php 调用一些数据库数据。但是ajax调用不行,网上也找不到解决办法。

这是我的代码:

test.php

<?php

include_once 'db_class.php';

$cat = $_GET['cat'];  

$dbconn = new dbconn('localhost', 'root', 'somepsw', 'blog');

 $dbconn->set_query("select * from posts where category = '".$cat."'");

 echo '<br/>'.$dbconn->query.'<br/>';

 $result = $dbconn->result;

 $num = $dbconn->num_results;

 $array = mysqli_fetch_assoc($result);

 echo json_encode($array);
?>

如果我在浏览器上输入该网址:http://127.0.0.1:82/blog/ws/test.php?cat=css

通过jsonEncode返回的数据是正确的,但是当我用jquery在html页面上加载它时,他无法读取数据。

test.html

<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script>
function ajaxCall() 

var css;

$.ajax(                                      
      url: 'test.php',
      type: "GET",     
      data: cat: css,              
      dataType: 'json',    
      success: function(rows)         
      

     alert(rows);

      ,
      error: function()  alert("An error occurred."); 

    );

    

    ajaxCall();

</script>
</head>
<body></body>
</html>

提前致谢。

【问题讨论】:

ajax 调用正在使用'/test.php'。浏览器正在使用“/blog/ws/test.php”。除非你正在做一些你没有展示的重写。 你不会从你的 test.php 中得到纯 json 数据,因为你已经打印了一些 echo ''.$dbconn->query.'';从您的代码中删除所有回显,仅 json_encode 除外。 按照@ManishJangir 的建议做,然后将var css; 更改为var css = "css";,它会起作用。 你知道这是超级危险的,对吧?切勿将GET 之类的用户输入数据添加到 SQL 语句中。 解决了删除其他 echo 语句,并将 var css 设置为 var="css";感谢大家的支持。 @likeitlikeit 无论如何,如果这很危险,我应该如何以安全的方式编写相同的功能?有什么建议吗? 【参考方案1】:

您的变量 css 没有价值。您想使用 字符串 'css'。也许您也希望能够加载其他类别。因此,将您的 ajaxCall 函数更改为

function ajaxCall(category)

    $.ajax(
        url: 'test.php',
        type: "GET",
        data: cat: category,
        dataType: 'json',    
        success: function(rows) 
           alert(rows);
        ,
        error: function() 
           alert("An error occurred.");
        
    );

并使用它调用它

ajaxCall('css');

【讨论】:

【参考方案2】:

我只是用 PDO 重写了 php 代码,现在应该更安全了。

db.php

<?php

$dbhost = "localhost";  

$dbuser = "root";

$dbpsw = "somepsw";    

$dbname= "blog"; 

try 

    @$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpsw);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);  


catch(PDOException $e) 

    echo "Connection failed, an error occured! Please contact server administrator."; //user friendly message
    getErrorsLog($e->getMessage());
 

 function closeDbConn () 

    $dbh = null;

 

 function getErrorsLog($message) 

    $file = 'dberrors.log';
    $date = date("d/m : H:i :");

    // Open the file to get existing content
    $current = file_get_contents($file);
    // Append a new error message to the file
    $current .= $date.$message;
    $current .= "\r\n";
    // Write the contents back to the file
    file_put_contents($file, $current);
    exit();

 

?>

blogdata.php

<?php

include_once "db.php";

$tableName = "posts";
$data = array();
@$view = $_GET["view"];

if (isset($_GET["view"]))  

    $stmt = $dbh->prepare("SELECT * FROM $tableName WHERE category =? ORDER BY created DESC"); 
 
 else   

    try 

    $stmt = $dbh->prepare("SELECT * FROM $tableName ORDER BY created DESC");

    

    catch (PDOException $e) 

        getErrorsLog($e->getMessage());

    

 

$stmt->bindValue(1, $view, PDO::PARAM_STR);

$stmt->execute();

$affected_rows = $stmt->rowCount(); //Rows count

 if ($affected_rows == 0) 

     echo "The data you looking for no longer exist, please contact the administrator.";
     exit();
 

foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) 

    $data[] = $row;

 

echo json_encode($data);

closeDbConn();

?>

【讨论】:

以上是关于通过ajax调用加载mysqli php数据的主要内容,如果未能解决你的问题,请参考以下文章

ajax成功后重新加载页面

为啥这个 PHP 脚本(由 AJAX 调用)随机无法正确加载 SESSION?

mysqli 简单的php注册登录功能

什么更快? Ajax 加载 JSON 或 Ajax 加载完整输出

PHP::mySqli 不插入带有变量的新行

将MySQL转化为mysqli