цикл while, применяющий пользовательскую функцию к mysql_fetch_assoc - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть вопрос относительно применения пользовательской функции к mysql_fetch_assoc, пока она находится в цикле while.См. Код ниже.

//current php page
$query = mysql_query("SELECT ... "); //returns multiple rows

while($rs = whileF($query)) {

    //do some fantastic stuff

}

//... functions.php page

function whileF($value = array()) {
    $var = mysql_fetch_assoc($value);

    foreach($var AS $k => $v) {
        $var[$k] = stripslashes($v);
    }

    return $var;
}

Мой вопрос: я хотел бы иметь возможность автоматически вырезать косые черты различных полей с помощью этого типа функции (и я также хотел бы записать некоторую отладкуданные в случае необходимости), но, похоже, они не очень хорошо взаимодействуют.Если я сделаю ..

print_r($var);

, он вернет все значения в массиве, но, выполнив оператор foreach, я получу «Предупреждение: неверный аргумент передан для foreach () в / home / .../include/functions.php "и если я попробую это ...

$var = array_map('stripslashes',$var);

, я получу" Предупреждение: array_map () [function.array-map]: Аргумент # 2 должен быть массивом в /home /.../ includes / functions.php "

Нечетная часть, похоже, что она правильно применяет функции foreach / array_map (значения отбрасываются).Я не хочу отключать ошибки, просто чтобы они исчезли, поскольку это было бы ...... менее эффективным программированием.Я знаю, что функция whileF () работает правильно, потому что она по-прежнему отображает всю информацию, и если я уберу операторы foreach / array_map, она будет работать без ошибок.

Мысли?Я знаю, что что-то упустил ......

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Это потому, что последний вызов mysql_fetch_assoc возвращает false. Вы должны завернуть foreach в if:

function whileF($value = array()) {
    $var = mysql_fetch_assoc($value);
    if ($var) {
       foreach($var AS $k => $v) {
            $var[$k] = stripslashes($v);
       }
    }
    return $var;
}
1 голос
/ 14 ноября 2011

Хотя Draevor ответил на это, я хотел бы задать несколько вопросов.

  1. Абсолютно бессмысленно использовать stripslashes() для данных, которые вы получили из базы данных.
  2. Хотя в любом случае может быть причина применить другую функцию. Но я бы не создавал пользовательскую функцию для этого, а скорее создал бы функцию, чтобы получить дату прямо в массив,

и затем зациклите этот массив, чтобы применить любые необходимые изменения:

$data = $db->getArr("SELECT * FROM table LIMIT 10");
forach ($data as $i => $row) {
  $data[$i]['name'] = htmlspecialchars($row['name']);
}

Таким образом, вы будете применять любую пользовательскую функцию без пользовательских функций.

...