【问题标题】:Unable to return database query results无法返回数据库查询结果
【发布时间】:2014-08-08 20:14:03
【问题描述】:

我正处于在网站上整合搜索工具的早期阶段,但我遇到了一个绊脚石。目前,我只是在做一些测试,使用 jQuery AJAX,但问题肯定出在我的 php 中:

...

$searchq = $_POST['searchq'];
$output = '';

$db = new PDO($dsn, $mysqluser, $mysqlpass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

function getData($db){
    // Prepare resource query statement
    $stmt = $db->query("SELECT * FROM mod_site_content WHERE alias = ':searchq'");
    // Bind paremeters
    $stmt->bindParam(':searchq', $searchq, PDO::PARAM_STR);
    // Execute query
    $stmt->execute();
    // Grab result
    $output = $stmt->fetchAll();
    // Return output
    done($output);
};

try {
    getData($db);
} catch(PDOException $e){
    echo $e->getMessage();
}

function done($out){
    echo $out;
}

目前我只是在我的 AJAX .done() 方法中将结果传递给 console.log()。无论我是否搜索 应该 存在的东西,上面的输出“Array”都没有。

如果我将上面的内容稍微更改为:

function getData($db){
    ...
    $output = $stmt->fetchAll();
    $result = implode($output,"--");
    // Reture output
    done($result);
};

我什么也得不到。

mod_site_content 看起来像这样:

id | type     | alias
-------------------------
1  | document | home
2  | document | projects
...

谢谢。

【问题讨论】:

  • $searchq 定义在哪里?
  • 是的,刚刚注意到 - 见已编辑。
  • 列名是别名??为什么?
  • 函数内部没有定义变量,这是由于php中的变量范围!请阅读它!
  • echo json_encode($out) 并确保您在浏览器上期待一个 json 对象。

标签: php jquery pdo


【解决方案1】:

您的问题在这里:

$stmt = $db->query("SELECT * FROM mod_site_content WHERE alias = ':searchq'");

用这个替换它:

$stmt = $db->prepare("SELECT * FROM mod_site_content WHERE alias = :searchq");

PDO 变量,即 :searchq 不应被 ' 包围,否则 PDO 会将它们视为字符串,当您尝试绑定 searchq 时,您的代码应该会出错

另外注意我用的是prepare()而不是query(),你需要先准备查询,然后绑定参数再执行

第三个问题,你应该将$searchq 传递给你的getData 函数

我在这里复制并粘贴了您的代码,并进行了编辑,只是为了让我清醒一下,您能测试一下并告诉我它是否有效吗?

$searchq = $_POST['searchq'];
$output = '';

$db = new PDO($dsn, $mysqluser, $mysqlpass, array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

function getData($db, $searchq){
    // Prepare resource query statement
    $stmt = $db->prepare("SELECT * FROM mod_site_content WHERE alias = :searchq");
    // Bind paremeters
    $stmt->bindParam(':searchq', $searchq, PDO::PARAM_STR);
    // Execute query
    $stmt->execute();
    // Grab result
    $output = $stmt->fetchAll();
    // Return output
    done($output);
};

try {
    getData($db, $searchq);
} catch(PDOException $e){
    echo $e->getMessage();
}

function done($out){
    if(is_array($out)){
       print_r($out);
    } else {
       echo $out;
    }
}

【讨论】:

  • 这仍然给出了一个空数组。如果我用:searchq 代替肯定在表中的字符串,它仍然可以工作。
  • 哦,刚刚注意到您使用的是query() 而不是prepare()...查看我的更新答案@verism
  • 感谢您的帮助,但结果完全一样。
  • @verism 你是在回显数组还是使用var_dumpprint_r
【解决方案2】:

echo json_encode($out) 并确保您在浏览器上期待一个 json 对象。

不知道为什么内爆返回值并回显它没有返回任何东西,除非->fetchAll 没有根据内爆返回一个实际的数组,在这种情况下它应该在某处踢出一个错误......

【讨论】:

  • 我的错 - 我根据 cmets 进行了多次修改,但我忘记了我的编辑。遗憾的是,这不是解决方案。
猜你喜欢
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多