4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

mysqli_fetch_assocの使い方について

Last updated at Posted at 2021-08-14

#独学エンジニア学習(レッスン5)

##疑問に思ったこと
sqlを使用せずにphpのみで読書ログの登録、表示を行っていた時はforeachを使って読書ログの表示を行っていた。そこでsqlをからデータを抽出してログを表示させるときもforeachを使ってもできるのではないかと思った。しかし、foreachでやろうとするとデータが1つしか表示できなかった。
下記のようなイメージ↓

    $sql_log = 'SELECT * FROM logs';

    $results = mysqli_query($link, $sql_log);

    $logs = mysqli_fetch_assoc($results);

    foreach ($logs as $log) {
        echo '書籍名:' . $log['title'] . PHP_EOL;
        echo '著者名:' . $log['author'] . PHP_EOL;
        echo '読書状況:' . $log['status'] . PHP_EOL;
        echo '評価:' . $log['score'] . PHP_EOL;
        echo '感想:' . $log['imp'] . PHP_EOL;
        echo '-------------' . PHP_EOL;
    }

この記述をすると初めの一つのデータしか抽出されなかった。
Qiita

    var_export(mysqli_fetch_assoc($results));

してみると、
Qiita
1個目のデータしか取得できていなかった。foreach使う場合はこの$logsの中に全部の配列が入っていないと繰り返しはできないから1個目の表示しかされなかったという風に解釈した。

結局動画で取り扱っていた通りのwhile文で実装
mysqli_fetch_assoc自体を繰り返さないといけなかった。

    $sql_log = 'SELECT * FROM logs';

    $results = mysqli_query($link, $sql_log);
    
    while ($log = mysqli_fetch_assoc($results)) {
        echo '書籍名:' . $log['title'] . PHP_EOL;
        echo '著者名:' . $log['author'] . PHP_EOL;
        echo '読書状況:' . $log['status'] . PHP_EOL;
        echo '評価:' . $log['score'] . PHP_EOL;
        echo '感想:' . $log['imp'] . PHP_EOL;
        echo '-------------' . PHP_EOL;
    }

##phpでの関数

mysqli_query:データベース上でクエリーを実行(関数)、実行したらmysqli_resultオブジェクトを返す。
mysqli_fetch_assoc($result):結果の行を連想配列で取得。$resultはmysqli_resultオブジェクト
mysqli_free_result:結果で使用したメモリを開放する。これを実行しないと負荷が重くなるので基本やる。

    $result = mysqli_query($link, $sql);

    //tureとfalseで返ってくるのでその結果に合わせてif文を使用
    if ($result) {
        echo 'データを追加しました' . PHP_EOL;
    } else {
        echo 'Error:データの追加に失敗しました' . PHP_EOL;
        echo 'Debugging error; ' . mysqli_error($link) . PHP_EOL;
    }

    //上記の$resultの結果を使用して実行(while文などで配列の中身を取り出したりできる)
    mysqli_fetch_assoc($result);

    while ($company = mysqli_fetch_assoc($results)) {
        echo '会社名;' . $company['name'] .PHP_EOL;
        echo '代表者名;' . $company['founder'] .PHP_EOL;
    }

    //メモリの解放
    mysqli_free_result($result);

mysqli_connect:sqlとの接続を行う

    mysqli_connect(string $host, string $username, string $passwd, string $dbname);

mysqli_close:sqlとの接続を切断

    mysqli_close($hoge);

###バリデーションで使用した関数
strlen:文字数をカウント
in_array:特定の文字列を含んでいるか判定

    strlen($hoge)

    $status = [
        '未読',
        '読んでる',
        '読了'
    ];

    if (!in_array($log['status'], $status, true)) {
        $errors['status'] = '読書状況は未読、読んでる、読了のいずれかを入力してください';
    }

##SQLでの関数

##知識

・コードエディタ上で複数行での記述の行い方(EOTの部分がキー)

    $sql = <<<EOT
    INSERT INTO logs (
        ...
    ) VALUES (
        ...
    )
    EOT;

・sql上で日本語が文字化けしないための記述(ググって出てきたやつだからこれが最適な書き方かどうかは不明)

    $link = mysqli_connect('db', 'book_log', 'pass', 'book_log');
    $link->set_charset('utf8');
4
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?