【问题标题】:PDO error with foreach and SQLforeach 和 SQL 的 PDO 错误
【发布时间】:2016-01-18 10:17:34
【问题描述】:

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

$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 (removed 地址)index.php 第 55 行

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

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

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:
    $yhteys->execute
    

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

    你很可能是这个意思

    foreach($SQL2 as $row){
    

    【讨论】:

    • 我不知道如何为 foreach 准备它,并将数组绑定到 $SQL。
    • 您已经将所有行放在$SQL2fetchAll 中,因此您可以循环遍历它。并检查@Alex 对您查询的另一个问题的回答
    • 接受了这个答案,因为它解决了我最大的问题,也就是给我带来错误的那个。
    【解决方案2】:

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

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

    表名和列名不能用参数代替。

    【讨论】:

    • 是的,也是如此!,在解决了所描述的问题之后。
    • 好的,那我应该怎么改变呢?我试过WHERE ".$hakuvalinta1." LIKE '?' OR ".$hakuvalinta2." LIKE '?'
    • 即使数据是文本,您也不需要在任何 ? 参数标记周围加上引号!
    • @NikoMatikainen 当你尝试这样做时发生了什么?您收到错误消息了吗?
    • 无错误,无返回。它根本没有回应任何项目。编辑:我的一个搜索返回“005892.52005892.52005892.52”,它与我的数据库无关。所以还是有问题。
    【解决方案3】:

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

    第一:您不能在查询中使用除数据之外的任何参数,不能使用表名或列名等。

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

    你也不需要'?'周围的单引号一个简单的?就足够了

    所以这个查询不会-&gt;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 ?");
    

    现在我们来到您的-&gt;fetchAll()-&gt;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'];
    
        }
    

    【讨论】:

    • 我也解决了我的最后一个问题,就是回声。 echo $row['TuoteSeloste'] + " " ; 应该是 echo $row['TuoteSeloste'] . " " ;,因为 php 使用 .对于字符串而不是 +。谢谢大家的帮助。 :)
    【解决方案4】:

    如果你想使用 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'];    
    }
    

    【讨论】:

    • 另外检查@AlexAndrei Answer 是否有SQL语句中的错误
    • 是的,我已经检查过了,也给了他一个评论,Alex 提到了一个问题,我提到了第二个问题。 @RiggsFolly
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 2011-11-23
    • 2014-04-30
    相关资源
    最近更新 更多