在非对象上调用成员函数 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 name
TABLE_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 "%PC13287%" ORDER BY "identifiantProjetDSR"
对于你提到的例子。无效查询。
所以当你将变量输出到屏幕时,你应该只使用 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
我正在尝试使用 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 name
TABLE_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 "%PC13287%" ORDER BY "identifiantProjetDSR"
对于你提到的例子。无效查询。
所以当你将变量输出到屏幕时,你应该只使用 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