#独学エンジニア学習(レッスン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;
}
var_export(mysqli_fetch_assoc($results));
してみると、
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');