使用$wpdb的Foreach循环不是来自行的结果

时间:2019-02-10 作者:Schmutly

我正在使用$wpdb 开发一个插件来检查一些行字段,看看它们是否匹配并回显true或false。当我的原始代码是一个单独的mysql数据库并以这种方式访问时,它仍在工作。作为我需要使用的wordpress插件$wpdb.

Im从一个单独的表(ipn\\U data\\U tbl)中进行选择,并正确附加wpdb前缀。我想检查该表中的每一行,并匹配从激活的软件检查项目名称和付款人电子邮件的位置。这一切都在wordpress之外的独立DB上运行,但现在我添加了$wpdb(错误?)它不起作用。

我觉得我用的不对。。有什么想法吗?:

<?php



require_once( $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-load.php\' );
    $ipn_table = $wpdb->prefix ."ipn_data_tbl";


   global $wpdb,$ipONactivate,$ipn_table;



$sql = "SELECT * FROM `$ipn_table` WHERE `item_name` = \'$product\' && `payer_email` = \'$serial\'";
$result = $wpdb->get_results($sql)or die(mysql_error());  //$wpdb->get_results

    if ($result->num_rows != 0) {
        foreach($result as $row){

        if ($row[`item_name`] == $product && $row[`payer_email`] == $serial) {
            echo true;
             } else {
            echo false;
                    }
                }
            }

?>

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

首先,您不应该以这种方式将SQL查询与任何变量连接在一起-这将导致SQL注入漏洞。

而且get_results 方法只返回一个结果数组。您不能将其用作对象并获取num_rows 从中可以看出,数组中没有这样的属性(它是WPDB 对象)。

另一个问题是默认情况下get_results 将以对象格式返回选定的行,而不是以数组形式返回。

下面是固定代码:

<?php
    require_once( $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-load.php\' );

    global $wpdb, $ipONactivate;

    $ipn_table = $wpdb->prefix ."ipn_data_tbl";

    $result = $wpdb->get_results( $wpdb->prepare(
        "SELECT * FROM {$ipn_table} WHERE item_name = %s AND payer_email = %s",
        $product, $serial
    ) );

    if ( ! empty( $result ) ) {
        foreach($result as $row) {

            if ($row->item_name == $product && $row->payer_email == $serial) {
                echo true;
            } else {
                echo false;
            }
        }
    }
?>
顺便说一句,您可以信任SQL。如果只选择具有给定product和serial的行,则不必遍历它们并检查它们是否等于给定值。

相关推荐

$wpdb->GET_RESULTS()不使用Unicode‘where’子句获取结果

我只需要一个简单的查询,就可以找到一个学生用孟加拉语写的名字记录。 $student_rcrd = $wpdb->get_results(\"SELECT * FROM student WHERE name=\'আবুল কালাম আজাদ\'\"); 虽然我的数据库中有\'আবুল কালাম আজাদ\', 查询返回零行!但与此查询不同,它工作得非常好- $student_rcrd = $wpdb->get_results(\"SELECT * FROM stud