使用foreach和SQL的PDO错误

时间:2016-01-18 10:17:35

标签: php mysql pdo

试图在我们的数据库中搜索项目,这是代码。

$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的新人,但在网站上工作的其他人想要使用它,所以我也必须使用它。

我已经检查过查询是否正常,之前执行的工作正常。

4 个答案:

答案 0 :(得分:4)

$yhteys->execute

我们不是execute PDO对象,我们只执行预备语句。 $yhteysPDO类型的对象,您正在该对象的其他位置正确使用预准备语句,但在您的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'];    
}