foreach循环不返回任何内容

时间:2013-12-24 00:42:04

标签: php wordpress foreach wpdb

我正在尝试从我拥有的Cart66表中提取用户数据并将其放入wordpress中的短代码中。 $ account是从会话数据中提取的整数。以下代码不会返回任何内容。

$account =Cart66Session::get(Cart66AccountId);
global $wpdb;
$fname=$wpdb->get_results("SELECT * FROM 'vfp_cart66_accounts' WHERE id = '$account',         ARRAY_N");
foreach ($fname AS $row)
{
echo $row;
}

返回“Array”

return $fname;

2 个答案:

答案 0 :(得分:0)

$fname=$wpdb->get_results(
    "SELECT * FROM `vfp_cart66_accounts` WHERE id = '$account'",
    ARRAY_N"
);

答案 1 :(得分:0)

好吧,首先,也许我是唯一一个看到这个问题的人,它可能是你整个问题的根源,但你的SQL引用结尾处有一个错误的双引号,它应该存在于最后实际的SQL字符串,而不是在请求的返回类型之后:

// at the end of this line you have: '$account',     ARRAY_N");
// this should be changed to:        '$account'", ARRAY_N);
$fname=$wpdb->get_results("SELECT * FROM 'vfp_cart66_accounts' WHERE id = '$account',         ARRAY_N");

即使第一个回答问题的人也没有纠正你,所以我假设他也没有看到。其次,使用单引号(')来转义表名是无效的。如果它被引用,请使用反引号(`)。单引号表示字符串,而不是数据库,表或字段,所有这三个引号都应仅使用反引号引用( SHOW 等实用程序查询除外)。请改用:

select * from `vfp_cart66_accounts` where id = '$account'

第三,正如您的评论者指出的那样,您可能容易受到SQL注入攻击。确保使用WP为您提供的工具,并执行此操作或类似工具:

$fname = $wpdb->get_results(
  $wpdb->prepare(
    'select * from `vfp_cart66_accounts` where id = %d',
    $account
  ),
  ARRAY_N
);

最后,您正在从数据库请求一个数组,但您正试图回应它,就好像它是一个标量值。这解释了为什么打印$row的值会产生"Array"。当您将array()转换为字符串时,默认情况下会得到"Array",因为数组可能是复杂的数据,可能无法精美地转换为字符串。作为对此的更正,您可以执行以下两项操作之一。

首先,如果您需要代表整个表格的整个结果数组,那么您只需将echo代码更改为:

foreach ($fname as $row) {
  // print the fname of the row
  echo $row['fname'];

  // do the other stuff you need to do with $row
  ...
}

OR ,如果您只需要该表中的fname字段,对于给定的ID,您可以使用另一个名为$wpdb的{​​{1}}函数来自数据库的结果数据的第一个条目中的一个特定字段,以及一些次要的SQL更改:

$wpdb->get_var()

现在。我不具备 Cart66 的具体知识。话虽如此,如果对PHP,WordPress和SQL语法的上述更改不会产生结果,那么您可能会遇到以下其他问题之一:

  1. 代码中某处出现了不同的PHP错误,导致此错误无法运行
  2. 永远不会调用此代码,因此永远不会执行
  3. 您错误拼写了表名,导致SQL错误
  4. 该表存在,但没有名为// use the get_var() function instead $fname = $wpdb->get_var( $wpdb->prepare( // 1) change the 'fields' of your sql to only get the `fname` field // 2) also add limit 1, to reduce load by only asking for one row // NOTE: #2 is optional really, because WP does this for you when using get_var, // but is good practice to only ask for what you need. so do it 'select fname from `vfp_cart66_accounts` where id = %d limit 1', $account ), ARRAY_N ); echo $fname; // print the value of field fname from vfp_cart66_accounts for id $account
  5. 的字段
  6. 表格和字段都存在,但表格中没有条目
  7. 其他一些不会想到的随意事物
  8. DEBUG#1

    对于#1,您可以尝试在代码执行的早期启用iderror_reporting()。在正常运行的磨削PHP脚本中,您可以在代码的早期某处添加以下两行:

    display_errors

    但是,您使用的是WordPress,因此您需要在wp-config.php文件中执行以下操作:

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    

    DEBUG#2

    确保您的代码正在运行。不要害怕在它上面直接抛出// find the line that looks like this and comment it out // define('WP_DEBUG', false); // add these two lines directly below it define('WP_DEBUG', true); ini_set('display_errors', 1); 语句,以确保它正在运行。像这样:

    die()

    DEBUG#3

    要调试#3,您需要访问MySQL的命令行工具或某些类型的GUI界面(如phpMyAdmin),以便您可以直接从数据库运行查询。以下是您应该运行的查询:

    // add a die() before everything
    die('I am running. Awesome!');
    
    // revised code
    $account = Cart66Session::get(Cart66AccountId);
    global $wpdb;
    $fname = $wpdb->get_var(
      $wpdb->prepare(
        'select fname from `vfp_cart66_accounts` where id = %d limit 1',
        $account
      ),
      ARRAY_N
    );
    echo $fname;
    

    这是SQL中唯一一个应该用单引号引用表名的地方的示例。运行此命令将生成以show tables like 'vfp_cart66_%'; 开头的所有表的列表。如果没有结果,则表名错误。如果您的结果不包含vfp_cart66_,那么您的表名称是错误的。如果你看到vfp_cart66_accounts,那么你很高兴。

    DEBUG#4

    这个需要直接从数据库或像phpMyAdmin这样的东西运行。您正在尝试确保您具有正确的字段名称。你这样做的方式是:

    vfp_cart66_accounts

    假设您正在调用的字段show create table `vfp_cart66_accounts`; 将是表中的auto_incremented字段。因此,您正在寻找一条与此类似的线:

    id

    确保上面有`id` bigint(20) NOT NULL AUTO_INCREMENT, 的行以:

    开头
    AUTO_INCREMENT

    如果没有,并且名称是除`id` 以外的其他名称,那么您可能有错误的字段名称。

    DEBUG#5

    确保您确实要显示数据。从您的id控制台或phpMyAdmin,运行:

    mysql

    如果你打赌任何结果,那么你有数据,而且你很好。

    DEBUG#3 - #5(替代方法)

    您拥有的另一个选项是在运行查询后直接转储select * from `vfp_cart66_accounts` limit 1; 对象,因为它包含您从MySQL收到的最后一个错误。你可以这样做:

    $wpdb

    通常,阅读MySQL错误消息有助于缩小SQL语法中的问题。

    DEBUG#6

    如果这些都没有任何帮助,那么你需要利用自己的经验来追踪你的插件或主题中的随机错误,这可能是什么。您甚至可能不会挖掘核心WP代码,因为虽然它确实有一些与您的问题无关的小错误,这些错误在我们说话时得到修复,但它是最稳定的CMS平台之一。互联网上超过1000万个网站中的更多网站使用它是有充分理由的。它有效,它是最新的,最重要的是,它是稳定的。

    我真的希望你发现这有用或至少从中学到了一些东西。希望其他人发现它也很有用。