PDO错误与foreach和SQL


PDO error with foreach and SQL

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

$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() in (已删除) 地址)索引.php在第 55 行

我不知道它有什么问题,但显然 foreach 不喜欢 PDO 或类似的东西。PDO有点新,但是在网站上工作的其他人想使用它,所以我也必须使用它。

我已经检查了查询是否有效,并且以前的执行工作正常。

$yhteys->execute

我们不execute PDO对象,我们只执行预准备语句。 $yhteysPDO 类型的对象,您正确地在该对象的其他地方使用了预准备语句,但在 foreach 循环中,您直接尝试在该非常PDO的对象上调用 execute,因此会出现错误。

很可能你的意思是这个

foreach($SQL2 as $row){

您正在尝试用参数替换列名,在这里

WHERE '?'  LIKE '?' OR '?' LIKE '?'
       ^                ^

表名和列名不能替换为参数。

似乎没有人涵盖所有问题,所以我会尝试这样做。

首先:不能在查询中使用除数据以外的任何参数,不能使用表名或列名等。

如果你考虑一下,这是非常合乎逻辑的。在将参数替换为数据之前,向数据库发出查询以进行编译、优化和创建执行计划。因此,如果数据库不知道查询中涉及的表名和列名,则无法编译查询。

您也不需要'?'简单的?就足够

所以这个查询不会->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,您将得到一个 assoc 数组,默认值是一个 assoc 数组和一个基于 0 的索引。换句话说,返回的数组将是大小的两倍。这在大型查询中可能很重要。

所以使用

    $rows = $SQL2->fetchAll(PDO::FETCH_ASSOC);
    foreach($rows as $row){
        echo $row['Nimi'] . " ";
        echo $row['TuoteSeloste'] . " " ;
        echo $row['Myyntihinta'];
    }
如果你想使用

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'];    
}