在非对象上调用成员函数 fetch()

Call to a member function fetch() on a non-object in

我正在尝试使用 pdo 在 php 中创建一个 select。
它可以处理很多请求,但当我使用类似的请求时却不行,例如:

查询:

SELECT * FROM projets WHERE `identifiantProjetRattachement` LIKE "%PC13287%" ORDER BY "identifiantProjetDSR"

这是我的 php 代码:

<?php
    function requette($requette,$table)
    {
        $bdd = new PDO('mysql:host=localhost;dbname=spb', 'root', '');
        $sql =  "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='$table';";
        $req = $bdd->query($sql);

        $titres = array();

        while($resultat = $req->fetch())
        {
           array_push($titres,$resultat['COLUMN_NAME']);
        }

        // ON A LES TITRES DONC ON PASSE AU CONTENU
        $sql =  $requette;
        $req = $bdd->query($sql);

        $retour = "";
        $cpt = 0;
        $nbLigne = 0;

        while($resultat = $req->fetch())
        {
           $nbLigne++;
           $retour .= "<tr><td class='boutonTouteLaCase' onclick='surlignerLigneProjets(this);'></td><td>$nbLigne</td>";
           for($cpt=0;$cpt<count($titres);$cpt++)
           {
             if($titres[$cpt] != "id")
               $retour .= "<td>".utf8_encode($resultat[$titres[$cpt]])."</td>";
           }

           $retour .= "</tr>";
        }
        echo $retour;   
      }

    $requette = htmlentities($_POST['requette']);
    $table = htmlentities($_POST['table']);

    echo $requette."<br/>";
    echo $table."<br/>";

     echo requette($requette,$table);?>

你认为这是口音问题吗?还是由于 '?
PS :此请求适用于 phpmyadmin。
谢谢大家。

where条件下使用column name而不是table nameTABLE_NAME='$table';

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='$table';

会是

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME='$CONDITION';

还有ORDER BY COLUMN_NAME is ASC OR DESC

查看 mysqli::query 的文档: http://php.net/manual/de/pdo.query.php

它可以 return PDOStatement 对象(可以获取的地方)或失败时为 FALSE,因此在尝试获取任何结果之前检查 sql 查询中是否有错误。

$req = $bdd->query($sql);
if (!$req) {
  return false;
  // maybe give some better error message
}

问题是您正在使自己的查询无效:

...

$requette = htmlentities($_POST['requette']);
$table = htmlentities($_POST['table']);

echo $requette."<br/>";
echo $table."<br/>";

echo requette($requette,$table);

请注意,您正在使用 htmlentities($requette),稍后您尝试 运行 确切的查询:

$sql =  $requette;
$req = $bdd->query($sql);

该查询将如下所示:

SELECT * FROM projets WHERE identifiantProjetRattachement
    LIKE &quot;%PC13287%&quot; ORDER BY &quot;identifiantProjetDSR&quot;

对于你提到的例子。无效查询。

所以当你将变量输出到屏幕时,你应该只使用 htmlentities(),但你不应该改变变量本身:

// Don't do this:
// $requette = htmlentities($_POST['requette']);
// $table = htmlentities($_POST['table']);

// just do this:
echo htmlentities($requette)."<br/>";
echo htmlentities($table)."<br/>";

echo requette($requette,$table);

除此之外,我假设您只能自己访问此内容,因为您直接 运行 宁用户提供的 sql 查询,因此如果未经授权的用户可以访问,那将是非常危险的

Call to a member function fetch() on a non-object in line what?

那个点会准确地告诉你哪里做错了。确保您没有通过将查询字符串分配给字符串而不是 PDO 指定的对象来覆盖您的查询字符串。 另一个是在调用 $req->fetch()

之前确保您的 $req->rowCount() returns 是一个值而不是 null