20200621のMySQLに関する記事は3件です。

PHP、MySQLで、Wordpressのような記事サイト制作。絞り込み、ページャー機能について

初めまして。
phpを独学で勉強中です。

phpの投稿フォームからMySQLへ保存し、一覧で書き出したり絞り込み検索ができるシステムを構築しています。
(Wordpressのブログのイメージです。ページャー機能も付けています)

絞り込み検索とページャーの機能はとりあえず動くようになったのですが、下記問題があります。
 ・複数項目の絞り込みに対応できない。
   →現状、キーワード検索のみ
 ・ページャーが、絞り込みをかけてもテーブル内すべてのデータを含んでしまう。
  2ページ目に移動すると絞り込みが解除されてしまう。

こちらどの様に改善するかお分かりになる方いらっしゃれば、ご教授いただけますと幸いです。
お手数おかけしますが、よろしくお願いいたします。

▼MySQL
テーブル名: shop
カラム1: ID(連番)
カラム2: s_name(テキスト)

▼HTML(検索フォーム)

<form action="search.php" method="post">
    <dl><dt>キーワード検索</dt>
        <dd><input type="text" name="sea_name"></dd></dl>
    <dl><dd><input id="send" type="submit" value="送信する"></dd></dl>
</form>

▼php(一覧表示)

<?php
$sea_name = $_POST['sea_name'];

$user = 'user';
$pass = 'pass';
$dsn = 'mysql:host=localhost;dbname=db';
$shop = new PDO($dsn, $user, $pass);

if (isset($_GET['page'])) {
$page = (int)$_GET['page'];
} else {
$page = 1;
}

if ($page > 1) {
// 例:2ページ目の場合は、『(2 × 10) - 10 = 10』
$start = ($page * 3) - 3;
} else {
$start = 0;
}

if(!empty($sea_name)) {
$sea_name = addslashes($sea_name);
$where = "s_name REGEXP '$sea_name' &";
}

if(!empty($where)) {
$where = substr($where, 0, -1);
$where = "WHERE " . $where;
}

$posts = $shop->prepare("
SELECT  *
FROM shop 
{$where}
ORDER BY id DESC
LIMIT {$start}, 3
");

$posts->execute();
$posts = $posts->fetchAll(PDO::FETCH_ASSOC);
?>

    <p>検索条件</p>
    <p>フリーワード:<?php echo $sea_name; ?></p>
            <p>検索結果</p>
    <?php 
    foreach ($posts as $post) {
        echo "
    <li>
    <h3>{$post['s_name']}</h3>
    </li>
    "
    ;}
    ?>
    </ul>
<?php 
$page_num = $shop->prepare("
    SELECT COUNT(*) id
    FROM shop
");
$page_num->execute();
$page_num = $page_num->fetchColumn();

$pagination = ceil($page_num / 3);

for ($x=1; $x <= $pagination ; $x++) { ?>
<a href="?page=<?php echo $x ?>"><?php echo $x; ?></a>
<?php } // End of for ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySQLのエラーログのフォーマット

MySQLのエラーログのフォーマットがググってもなかなか出なかったので、ここに記す。

MySQL 8.0

timestamp thread_id [priority] [err_code] [subsystem] message

MySQL (< 8.0)

timestamp thread_id [priority] message

[err_code] と [subsystem] がMySQL 8.0で追加されたそうです。

ソース:https://dev.mysql.com/doc/refman/8.0/en/error-log-format.html

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

local にデータベースの host も client も無い時に docker でのちょろっとした確認方法

手元の端末でちょろっとqueryの確認をしたいけど、そもそもローカルにclientすらインストールしていなかった時の不便を解決するための備忘録です。サーバ側のバージョン違いによる機能や挙動の確認は docker tag で制御する想定。

Postgresql

  • p11, mydb はご自由に変更を
  • docker exec をすぐに実行してしまうと docker run の初期化が終わっておらずエラーが出ることがあるが、深呼吸して時間をおいて実行すれば動きます
$ docker run --rm -d --name=p11 -e POSTGRES_USER=u -e POSTGRES_PASSWORD=p -e POSTGRES_DB=mydb postgres:11
$ docker exec -it p11 psql -h localhost -U u -d mydb
# inside docker
exit;
# outside docker
$ docker stop p11

MySQL

  • m8, mydb はご自由に変更を
docker run -it --rm -d --name=m8 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -e MYSQL_DATABASE=mydb mysql:8
docker exec -it m8 mysql -h localhost mydb
# inside inside docker
exit;
# outside docker
docker stop m8

SQLite

  • 公式dockerイメージは見つからなかった。
  • 出力をカンマ区切りにするためには $'\t', に変更すればよい
docker run -it --rm nouchka/sqlite3 sqlite3 -header -separator $'\t'
sqlite> .q
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む