Почему $ line = fgets ("data / $ f_handle") не работает - PullRequest
0 голосов
/ 09 декабря 2018

Ладно, ситуация выглядит достаточно просто, так что я делаю не так?

$fname = "students.dat";
$f_handle = fopen("data/$fname", 'r');
$num_lines = count(file("data/$fname"));
for($x=0; $x<$num_lines; $x++) {
    $line = fgets("data/$f_handle");
    echo "Line $x: ($line)<br />"; //exit;
    if(strpos($line,$studentID)) {
    // Line has studentID
    echo "Line $x: ($line)($studentID)<br /> <br />";
    // Exit the loop if found
    break;      
}

Мой вывод такой:

Line 0: ()
Line 1: ()
Line 2: ()
Line 3: ()
Line 4: ()
Line 5: ()

Я перешел к плоскому файлу, потому что мой MySQLпопытки были / не увенчались успехом, $ studentID верен, и в файле данных шесть строк.Любой совет, пожалуйста?

1 Ответ

0 голосов
/ 09 декабря 2018

$f_handle содержит объект ресурса (дескриптор файла, который вы только что открыли).Интерполяция в строке, как в "data/$f_handle", не имеет смысла.Вместо этого просто используйте fgets($f_handle).

Кроме этого, в вашем коде есть еще несколько проблем:

  • Подсчет количества строк по отдельности, как вы делаете, не самый полезныйподход, так как требует чтения файла дважды.Вместо этого используйте что-то вроде $x = 0; while(($line = fgets($f_handle)) !== false) { ... ; $x++; }.
  • strpos() возвращает false, если совпадений нет, но также возвращает 0, если подстрока иглы найдена в начале строки стога сена.Оба ведут себя как false в состоянии if.Вместо этого вы должны напрямую сравнить с false: if(strpos(...) !== false).
  • Однако strpos(), скорее всего, здесь также не будет работать.Представьте, что вы ищете студента с идентификатором 10, но текущая строка, которую вы сканируете, имеет идентификатор 102.Ваш тест будет неправильно соответствовать этой строке.
  • После if() есть открывающая фигурная скобка, но нет соответствующей закрывающей фигурной скобки.
...