PHP Array возвращает неправильное значение - PullRequest
1 голос
/ 18 ноября 2011

Теперь $ num - это просто количество строк данных из поиска в базе данных. Иногда это будет 0. $ procrastinate является аргументом функции.

if ($num==0) {
    return "Do not appear to be registered. Please check your email input again.";
    break 1;
} else { // there is an entry. check for consistency
    $procrastinateDB = mysql_result($result,0,'procrastinate');
    if ($procrastinate != $procrastinateDB) {
        return "Answer to your procrastination question is incorrect. Please try again!";
        break 2;
    }
    else {
        $username = mysql_result($result,0,'usrname');
        $passwd = mysql_result($result,0,'passwd');
        return array($username, $passwd, $num);
        break 2;
    }
}

Что я не понимаю, так это то, что даже когда $ num = 0, массив все еще возвращается с $ usersname = 'D', $ passwd = 'o' и $ num = ''. Понятно, что он берет первое возвращенное утверждение и просто присваивает эти переменные каждому символу в первом возвращенном предложении в последовательном порядке.

Как мне это остановить? Я не хочу, чтобы $ username, $ passwd, $ num содержали какое-либо значение, если в базе данных нет записи.

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Некоторые комментарии о вашем коде:

  • Вам не нужно break после return.
  • break не работает для if в PHP.
  • Вам не нужно делать else, если вы уже используете return.

Я внес некоторые изменения в ваш код, чтобы сделать это более заметным итакже уменьшает цикломатическую сложность.Возможно, это поможет вам легче найти ошибку:

function unnamed(/* ... unknown parameters ... */)
{
    /* ... some code ... */
    if ($num==0)
    {
        return "Do not appear to be registered. Please check your email input again.";
    }

    // there is an entry. check for consistency
    $procrastinateDB = mysql_result($result,0,'procrastinate');
    if ($procrastinate != $procrastinateDB)
    {
        return "Answer to your procrastination question is incorrect. Please try again!";
    }

    $username = mysql_result($result,0,'usrname');
    $passwd = mysql_result($result,0,'passwd');
    return array($username, $passwd, $num);
}

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

$string = 'ABC';
echo $string[0]; // A
echo $string[2]; // C

Часто лучшеесть функция, возвращающая один тип, а не несколько.Однако это зависит от вашего дизайна и стиля кодирования, поэтому я могу только предлагать, например, возвращать объект, который содержит сообщение о состоянии, код состояния (успех / сбой) и - если доступно - массив данных, которые вы хотите вернуть.Однако это зависит от того, что вы хотите / нужно.Вы также можете проверить тип возврата с помощью is_array.

1 голос
/ 18 ноября 2011

массив все еще возвращается с $ usersname = 'D', $ passwd = 'o' и $ num = ''.

Когда $num равно 0, вывозвращают строку:

Не похоже, чтобы быть зарегистрированным.Пожалуйста, проверьте свою электронную почту еще раз.

В PHP вы можете получить доступ к строкам, таким как массивы.Итак, я предполагаю, что вы не проверяли, возвращена ли вам строка или массив, и сделали что-то вроде этого:

list($username, $passwd, $num) = yourFunction();

Так как строки можно принимать как массивы, $username будетD, $password будет o, а $num будет пробелом, поскольку это первые три символа.

Я предлагаю использовать is_array перед доступом к значению, чтобы убедиться, что вызнаю, что вы получаете.

$ret = yourFunction();
if(is_array($ret)){
   list($username, $passwd, $num) = $ret;
}
else{
   // Something else
}
...