试图在我们的数据库中搜索项目,这是代码。
$SQL = $yhteys->prepare("SELECT *, COUNT(*) AS Maara FROM TuoteTiedot
INNER JOIN VarastoTuoteLista ON TuoteTiedot.TuoteID=VarastoTuoteLista.TuoteID
INNER JOIN Varastopaikat ON VarastoTuoteLista.PaikkaID=Varastopaikat.PaikkaID
WHERE '?' LIKE '?' OR '?' LIKE '?'");
$SQL->execute(array($hakuvalinta1, $haku1, $hakuvalinta2, $haku2));
$tiedot = $SQL->fetchAll();
if($SQL->execute(array($haku1, $hakuvalinta1, $haku2, $hakuvalinta2))){
if($SQL->fetchColumn() > 0){
$SQL2 = $yhteys->prepare("SELECT * FROM TuoteTiedot
INNER JOIN VarastoTuoteLista ON TuoteTiedot.TuoteID=VarastoTuoteLista.TuoteID
INNER JOIN Varastopaikat ON VarastoTuoteLista.PaikkaID=Varastopaikat.PaikkaID
WHERE '?' LIKE '?' OR '?' LIKE '?'");
$SQL2->execute(array($haku1, $hakuvalinta1, $haku2, $hakuvalinta2));
$SQL2->fetchAll();
foreach($yhteys->execute() as $row){ //this is line 55
echo $row['Nimi'] + " ";
echo $row['TuoteSeloste'] + " " ;
echo $row['Myyntihinta'];
}
}
echo "</table>";
} else {
echo 'Nothing found';
}
它在页面上出错,它看起来像这样:
致命错误:调用未定义的方法PDO :: execute()(删除 地址)第55行的index.php
我不知道它有什么问题,但显然foreach不喜欢PDO或类似的东西。有点像PDO的新人,但在网站上工作的其他人想要使用它,所以我也必须使用它。
我已经检查过查询是否正常,之前执行的工作正常。
答案 0 :(得分:4)
$yhteys->execute
我们不是execute
PDO对象,我们只执行预备语句。 $yhteys
是PDO
类型的对象,您正在该对象的其他位置正确使用预准备语句,但在您的foreach循环中,您正在直接尝试在execute
上调用PDO
对象因此错误。
很可能你的意思是
foreach($SQL2 as $row){
答案 1 :(得分:3)
您正尝试使用参数替换列名,此处为
WHERE '?' LIKE '?' OR '?' LIKE '?'
^ ^
表和列名称不能替换为参数。
答案 2 :(得分:1)
似乎没有人涵盖所有问题所以我会尝试这样做。
首先:您不能在查询中使用除数据以外的任何参数,也不能使用表名或列名等。
如果你认为这很合乎逻辑。您将查询发布到数据库以进行编译,优化并创建执行计划 BEFORE 您将参数替换为数据。因此,如果数据库不知道查询中涉及的表名和列名,则无法编译查询。
您也不需要'?'
周围的单引号,简单?
就够了
因此,此查询不会->prepare
$SQL2 = $yhteys->prepare("SELECT * FROM TuoteTiedot
INNER JOIN VarastoTuoteLista ON
TuoteTiedot.TuoteID=VarastoTuoteLista.TuoteID
INNER JOIN Varastopaikat ON
VarastoTuoteLista.PaikkaID=Varastopaikat.PaikkaID
WHERE '?' LIKE '?' OR '?' LIKE '?'");
你必须使用真正的列名,我不知道你的列名是什么,所以这只是一个例子
$SQL2 = $yhteys->prepare("SELECT * FROM TuoteTiedot
INNER JOIN VarastoTuoteLista ON
TuoteTiedot.TuoteID=VarastoTuoteLista.TuoteID
INNER JOIN Varastopaikat ON
VarastoTuoteLista.PaikkaID=Varastopaikat.PaikkaID
WHERE COLUMN1 LIKE ? OR COLUMN2 LIKE ?");
现在我们来到你的->fetchAll()
。 ->fetchAll
返回一个包含结果集中所有行的数组,因此您需要将该数据放入变量并将该循环放在该数组上
此外,如果您使用参数PDO::FETCH_ASSOC
,您将获得一个关联数组仅,默认情况下是一个关联数组和一个基于0的索引。换句话说,返回的数组将是大小的两倍。这在大型查询中很重要。
所以使用
$rows = $SQL2->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
echo $row['Nimi'] . " ";
echo $row['TuoteSeloste'] . " " ;
echo $row['Myyntihinta'];
}
答案 3 :(得分:0)
如果您想使用foreach循环打印所有数据,请使用:
$SQL2->execute(array($haku1, $hakuvalinta1, $haku2, $hakuvalinta2));
$data = $SQL2->fetchAll();
foreach($data as $row){ //this is line 55
echo $row['Nimi']." ";
echo $row['TuoteSeloste']." " ;
echo $row['Myyntihinta'];
}