データベースを使ったPHPサイトを作成していた時、トップページはURLでテキストが変わるようにできたのに、内部リンクを使ってトップページから下層ページに移動するとURLが元に戻ってしまう問題が起きました。
例)https://sample/?fruit=1&area=3
↓ 内部リンクで下層ページにアクセス
https://sample/
これを解決するのが $config[‘query_string’] です。
データベースを使ったPHPサイトの作り方については別の記事(有料)で詳しく解説しているのでご参照ください。

初心者の私がデータベースを使用したコードを理解するまで【コード例あり】|momiji
Web制作の勉強をしていて、避けたかったものがあります・・・ それが、データベースです。 触ったら危ないことが起きるんじゃないかとか・・・ 実際にAIを使って学習していたのですが、 PDOって何? DSNって何? prepare? exec…
$config['query_string'] の解説
そもそも何をしているか
問題: sample/?fruit=1&area=3 でページを開いても、リンクをクリックして urlchange.php に移動すると ? が消えてしまい、デフォルト表示に戻ってしまう。fruit=1&area=3
解決: 現在のURLパラメータを変数に保存して、全てのリンクに自動で付け加える。
コードの意味
$config['query_string'] = $_GET ? '?' . http_build_query($_GET) : '';
これを分解すると:
| 部分 | 意味 |
|---|---|
$_GET | URLの ? 以降のパラメータを配列で取得するPHPの機能 |
http_build_query($_GET) | 配列を fruit=1&area=3 の形式の文字列に変換するPHP関数 |
$_GET ? ... : '' | パラメータがあれば ? を作り、なければ空文字 |
具体例
| アクセスURL | $_GET の中身 | $config['query_string'] の値 |
|---|---|---|
sample/urlchange.php/ | [](空) | ''(空文字) |
sample/urlchange.php/?fruit=1 | [' | ? |
sample/urlchange.php/?fruit=1&area=3 | [' | |
リンクでの使い方
<!-- パラメータなしのとき -->
<a href="/urlchange.php">
<!-- パラメータありのとき(?fruit=1&area=3) -->
<a href="/urlchange.php?fruit=1&area=3">
これを1つのコードで自動切り替え:
<a href="/urlchange.php<?php echo $config['query_string'] ?>">
- パラメータなし →
/urlchange.php(空文字が付くだけ) ?fruit=1&area=3あり →/urlchange.php?fruit=1&area=3
全体の流れ図
ユーザーが sample/urlchange.php/?fruit=1&area=3 にアクセス
↓
data.php で $_GET を取得
↓
$config['query_string'] = '?fruit=1&area=3' を保存
↓
ページ内の全リンクに付与:
urlchange.php?fruit=1&area=3
urlchange2.php?fruit=1&area=3
urlchange3.php?fruit=1&area=3
↓
リンク先でも同じ処理が動く → さらに次のリンクにも引き継がれる
※ data.php は、データベースを使ってやりたいことが書いてあるファイルのことで、私がつけた名前です。
なぜ http_build_query を使うのか
自分で '?fruit=' . $_GET['fruit'] . '&area=' . $_GET['area'] と書くこともできますが、http_build_query を使う利点:
- パラメータが何個でも自動対応 — 将来
?fruit=1&area=2&type=3のように増えても変更不要 - 安全 — 特殊文字を自動でURLエンコードしてくれる
- パラメータがないときのケア不要 —
$_GETが空なら空文字を返す三項演算子と組み合わせるだけ
まとめ
たった1行追加するだけで、サイト内を移動してもURLパラメータが消えなくなる仕組みです。
// この1行を データベースについて書いてあるファイル に追加
$config['query_string'] = $_GET ? '?' . http_build_query($_GET) : '';
// リンクの末尾にこれを付けるだけ
<?php echo $config['query_string'] ?>

