1

テキストファイルから、explode()を使用して、各行の最初の2つの項目(区切り文字としてコンマを使用)を取得するにはどうすればよいですか?


ユーザー名チェックが機能しています。
ただし、メールはそうではありません。
countEmailは変更されません。

これは私が得た出力です:(
既存の電子メールを追加しようとしましたが、countEmailは変更されませんでした)

array(3) {    <--- Previous user
  [0]=>
  string(11) "blabla123"
  [1]=>
  string(28) " blahblah@blah.com"
  [2]=>
  string(11) " 123, 1990
"
}
array(1) {
  [0]=>
  string(1) "
"
}

Notice: Undefined offset: 1 in C:\xampp\htdocs\Brets\register.php on line 35

Notice: Undefined offset: 1 in C:\xampp\htdocs\Brets\register.php on line 36
00 (countUser and countEmail)

そして、これは私が使用するコードです:

<form action="register.php" method="POST">
    Username: <br> <input type="text" name="username"> <br>
    Password: <br> <input type="password" name="password"> <br>
    Email: <br> <input type="text" name="email"> <br>
    Year of Birth: <br> <select name="year">
                            <option value="1990">1990</option>
                            <option value="1991">1991</option>
                            <option value="1992">1992</option>
                            <option value="1993">1993</option>
                        </select> <br>
    <input type="submit" value="Submit">
</form>

<?php
$next = 'register.php';
$greet = 'Welcome! <p>Please register using the form above.</p>';

if (isset($_POST['username']) && isset($_POST['password']) && isset($_POST['email']) && isset($_POST['year'])) {
    $username = htmlentities($_POST['username']);
    $password = htmlentities($_POST['password']);
    $email = htmlentities($_POST['email']);
    $year = htmlentities($_POST['year']);

    if (!empty($username) && !empty($password) && !empty($email) && !empty($year)) {
        $countEmail = 0;
        $countUser = 0;
        $filename = 'user.txt';
        $handle = fopen($filename, "a+");
        if ($handle) {
            while (($line = fgets($handle, filesize($filename))) !== false) {
                $line=explode(',', $line, 3);
                echo '<pre>';
                var_dump($line);
                echo '</pre>';
                if (($line[0] == $email) || ($line[1] == $email)) { $countEmail++; }
                if (($line[0] == $username) || ($line[1] == $username)) { $countUser++; }
            }
            if (!feof($handle)) {
                echo "Error: unexpected fgets() fail\n";
            }
        }
        if ($countEmail == 0 && $countUser == 0) {
            fwrite($handle, "$username, $email, $password, $year\r\n");
            fclose($handle);
            $greet = 'Thank you!';
        }
        if ($countEmail != 0) {$greet = 'An account with that email aready exists.';}
        if ($countEmail != 0) {$greet = 'Username already taken.';}
    } else { $greet = 'Fill in all fields.';}
}
echo $greet;

?>

混乱しているように思われる場合は、お詫び申し上げます。
また、これを行うにはおそらくもっと良い方法があることを私は知っていますが、私はちょうどphpを学び始めました:)

4

4 に答える 4

2

php関数fgetsはファイルを行ごとに読み取り、行ごとに処理して展開できるようにします。

マニュアルから:

<?php
$handle = @fopen($filename, "r");
if ($handle) {
    while (($line = fgets($handle, 4096)) !== false) {
        // do something with $line here
    }
    if (!feof($handle)) {
        echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
}
?>
于 2012-07-04T15:39:13.457 に答える
1

次のように単純にする必要があります。

list($item1, $item2) = explode(',', $str);

fgets()行ごとに読み取るために使用します。

ところで、データがコンマで区切られている場合は、fgetcsv()同様に見ることができます。

于 2012-07-04T15:37:35.863 に答える
1
$dataLines = explode("\n", $dataIn);

...

foreach ($dataLines as $line) {
  $line=explode(',', $line,3);
  if (siezof($line)<2) continue;
  if (($line[0] == $email) || ($line[0] == $email)) { $countEmail++; }
  if (($line[0] == $username) || ($line[0] == $username)) { $countUser++; }
}
于 2012-07-04T15:42:38.873 に答える
0

爆発で制限を使用すると、残りの文字列を含む最後の要素が残ります。

http://php.net/manual/en/function.explode.php

したがって、最初の 2 つの要素だけが必要な場合は、

たとえば、「a、b、c、d」から [「a」、「b」] を使用します。

$result = explode(",", $array, 3) 
=> ["a", "b", "c,d"]

次に、ポップして最後のものを削除します。

array_pop($result);
print_r($result);
=> ["a", "b"]
于 2012-07-04T15:42:51.240 に答える