使用foreach列出:“非法字符串偏移”PHP

时间:2014-03-22 20:53:06

标签: php foreach

我的功能问题应该列出所有"推文"。 我不知道为什么会出现错误,因为我之前使用过此代码(3个月),而且它可以用于我的其他项目。

我正在使用PHP 5.4.12

有我的代码:

function getTweet()
{
    global $bdd;

    $tweets = $bdd->query("SELECT * FROM tweets");

    foreach($tweets as $tweet){
        echo $tweet['content'];
    }
}

有错误:

  

警告:非法字符串偏移'内容' (第8行)

使用print_r:

  

1Test 1700

1 = id
Test 1 = content
7 = my id
0 = retweet
0 = favourite

使用此代码我只有一个结果(但有几个结果):

function getTweet()
{
    global $bdd;

    $tweets[] = $bdd->query("SELECT * FROM tweets");
    foreach($tweets as $tweet){
        echo $tweet['content'];
    }

}

有了这个,我就有了我的变种类型:

<?php 
function getTweet()
{
    global $bdd;

    $tweets = $bdd->query("SELECT * FROM tweets");
    echo gettype($tweets);
    // Return "array"

    foreach($tweets as $tweet){
         echo gettype($tweet);
         // Return "integerstringintegerintegerinteger"
    }

}

&GT;

2 个答案:

答案 0 :(得分:0)

这可能会有所帮助。它检查以确保$ tweet ['content']首先存在,如果不存在,将转储$ tweet中找到的数组键。这可以让您更好地了解数据可能会对触发这些错误做些什么。

function getTweet()
{
    global $bdd;

    $tweets = $bdd->query("SELECT * FROM tweets");

    foreach($tweets as $tweet){
        // For debugging, comment this out when tested:
        if(!is_array($tweet) {
            echo "This is NOT an array: $tweet \n<br />\n";
            continue;
        }
        if(isset($tweet['content'])) {
            echo $tweet['content'];
        }
        // For debugging, comment this out when tested:
        else {
            var_dump(array_keys($tweet));
        }
    }
}

答案 1 :(得分:0)

问题:

*->query不返回&#34;数据&#34;在PHP的本机函数/ API中

$bdd->query是一个自定义函数,因此如果您不发布函数代码,则无法知道导致失败的原因。

但如果代码与此问题相同:PHP SQL Syntax Error using Bind parameters

public function query($query, $params = null, $fetchmode = PDO::FETCH_ASSOC)
{
    $query = trim($query);

    $this->Init($query,$params);

    if (stripos($query, 'select') === 0){
        return $this->sQuery->fetchAll($fetchmode);
    }
    elseif (stripos($query, 'insert') === 0 ||  stripos($query, 'update') === 0 || stripos($query, 'delete') === 0) {
        return $this->sQuery->rowCount();
    }   
    else {
        return NULL;
    }
}

在某些时候,您可能会使用其他值更改PDO::FETCH_ASSOC

尝试:

    ...
    if (stripos($query, 'select') === 0){
        echo 'Mode is ASSOC ', (PDO::FETCH_ASSOC===$fetchmode ? 'TRUE' : 'FALSE'), '<BR>';//should return TRUE
        return $this->sQuery->fetchAll($fetchmode);
    }
    ...

这个&#34;测试用例&#34;必须返回TRUE,如果返回FALSE是您更改$fetchmode

的值的原因

提示:

我个人不知道为什么你在使用fetchAll时获取代码会更好

  • fetchAll只在一个变量中汇集所有内容(更高的内存消耗PHP)
  • fetch一次请求一行