# PHP の使いかた

このセクションにはPHPスクリプトを書くにあたってよく問題となる事柄が 集められています。

1. PHP の関数のパラメータの順番を覚えられません。だって関数によってばらばらなんだもん。
2. あらゆるフォームから送信されたデータを扱うことができる汎用的な PHPスクリプトを書きたいのですが、POSTメソッドでどのようなデータ が送信されたかを知るにはどうするのですか？
3. シングルクオート(')をバックスラッシュでエスケープされた シングルクオート(\')に変換しなければならないのですが、 正規表現を用いてこれを行うにはどの様にするのですか？ 同様に " を \" に、\ を \\ に変換したいのです。
4. 次のようなコードを実行すると、思った通りの順番で出力が表示されません。 function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); なぜですか？
5. 改行されないのですが？ <pre> <?php echo "これは1行目"; ?> <?php echo "この行は改行に続いて出力されるはず"; ?> </pre>
6. 'Warning: Cannot send session cookie - headers already sent...'や 'Cannot add header information - headers already set...'といった メッセージが出力されるのですが。 sent...'.
7. リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか？
8. IISで認証を行おうとすると'No Input file specified'というエラーが 発生します。
9. Windows: 他のコンピュータと共有しているファイルに、IIS でアクセスできません。
10. どうすればXMLとPHPは共存することが出来るのですか？XMLの <?xml>タグがPHPでエラーになります。
11. あらかじめ設定されている変数を全て網羅したリストはどこにあるので すか？なぜPHPのドキュメントにはその一覧がないのですか？
12. フリーではない商用ライブラリである PDFLib を使わずに PDFファイルを生成するにはどうしたらよいでしょうか？ フリーのもので、外部のPDFライブラリが不要なものがいいのですが。
13. いくつかの PHP ディレクティブでは、バイト値を int ではなく省略形で設定できます。この省略形で使えるオプションを教えてください。

PHP の関数のパラメータの順番を覚えられません。だって関数によってばらばらなんだもん。

  PHP は、さまざまな外部ライブラリの間を取り持つ糊のような存在です。 そのため、時にはちょっとごちゃごちゃすることもあります。 しかし、経験上、以下のような規則があるようです。

  配列関数 のパラメータは "needle, haystack" の順だけれども、 文字列関数 はその逆で "haystack, needle" の順となります。

  PHP 8.0 以降では、名前付き引数 によってパラメータ名で引数を渡すことができるため、パラメータの順序をそれほど気にする必要はありません。

あらゆるフォームから送信されたデータを扱うことができる汎用的な PHPスクリプトを書きたいのですが、POSTメソッドでどのようなデータ が送信されたかを知るにはどうするのですか？

  PHPは$_POSTのような 定義済みの変数 を沢山提供しています。$_POST を連想配列として ループすることでPOSTされた全ての値にアクセスできます。例えば、 `foreach` で単純にループして empty() で値をチェックし、 結果を出力します。

      <?php
      $empty = $post = array();
      foreach ($_POST as $varname => $varvalue) {
          if (empty($varvalue)) {
              $empty[$varname] = $varvalue;
          } else {
              $post[$varname] = $varvalue;
          }
      }

      print "<pre>";
      if (empty($empty)) {
          print "None of the POSTed values are empty, posted:\n";
          var_dump($post);
      } else {
          print "We have " . count($empty) . " empty values\n";
          print "Posted:\n"; var_dump($post);
          print "Empty:\n";  var_dump($empty);
          exit;
      }
      ?>

シングルクオート(')をバックスラッシュでエスケープされた シングルクオート(\')に変換しなければならないのですが、 正規表現を用いてこれを行うにはどの様にするのですか？ 同様に " を \" に、\ を \\ に変換したいのです。

  もしデータベースに格納するためにそんなことをしようとしているのなら、 データベース自身が持つエスケープの仕組みを使うようにしましょう。 MySQL なら mysql_real_escape_string()、 PostgreSQL なら pg_escape_string() などです。 汎用的な関数 addslashes() や stripslashes() もありますが、 これはさらに古い時代の PHP コードで使われていたものです。

  手動で値をエスケープする方法はエラーが発生しやすく、コンテキストに依存します。 エスケープした文字列を連結してクエリを組み立てるのではなく、 プリペアドステートメントとパラメータバインディングをサポートする データベース API を使うようにしてください。

次のようなコードを実行すると、思った通りの順番で出力が表示されません。

    function myfunc($argument)
    {
        echo $argument + 10;
    }
    $variable = 10;
    echo "myfunc($variable) = " . myfunc($variable);

なぜですか？

  式の中で関数の実行結果を使用する(例えば上の例の様に他の文字列と 連結する)ためには、echo するのではなく、その 値を return しなければいけません。

改行されないのですが？

    <pre>
    <?php echo "これは1行目"; ?>
    <?php echo "この行は改行に続いて出力されるはず"; ?>
    </pre>

  PHPでは、"?>"か"?>\n"(\nは改行を表します)をPHPのコードブロッ クの終端と見なします。このため、コードブロック終端の改行記号は省 略され、表示される文は1行になります。つまり、改行をさせるために は、PHPのコードブロックの終端の後にもう1つ改行を挿入する必要があ るということです。

  なぜPHPはこのようなことをするのでしょうか？なぜならHTMLを出力する 場合にはこの方が都合のよいことが多いからです。もしとても長い1行を 出力しなければならない場合に、改行が解釈されてしまうとしたらどう でしょう。ソースコードの1行もとても読めないくらい長いものになって しまいます。

'Warning: Cannot send session cookie - headers already sent...'や 'Cannot add header information - headers already set...'といった メッセージが出力されるのですが。 sent...'.

  header(), set_cookie()や セッション関数は出力ストリームに ヘッダを付加する関数で、ヘッダを送信できるのは本文の出力を 開始する前のみです。headers_sent()を使って 既にヘッダが送信済みでないかチェックすることができます。 出力制御関数もご覧ください。

リクエストヘッダに直接アクセスしたいのですが、どうすればよいですか？

  もしPHPがApacheモジュールとして動作しているなら、 getallheaders()を使えば全てのヘッダを取得する ことができます。下のちょっとしたコードで全てのリクエストヘッダを 表示することができます。

      $headers = getallheaders();
      foreach ($headers as $name => $content) {
          echo "headers[$name] = $content<br />\n";
      }

  apache_lookup_uri(), apache_response_headers(), fsockopen()も参照ください。

IISで認証を行おうとすると'No Input file specified'というエラーが 発生します。

  これはIISのセキュリティモデルの欠点で、IISで動作するCGIに共通する 問題です。これを回避策するには、認証のかかったディレクトリに(PHP が解釈しない)HTMLファイルを作成します。そしてMETAタグを使ってPHP を使用したページにリダイレクトするか、リンクを張ります。こうすれ ばPHPは認証済みかどうかを正しく認識することが出来ます。 また、これは他のNTウェブサーバーに は影響ありません。詳しくは» http://support.microsoft.com/kb/q160422/ とHTTP 認証を 参照ください。

Windows: 他のコンピュータと共有しているファイルに、IIS でアクセスできません。

  `Go to Internet Information Services` を変更する必要があります。PHP ファイルを選択して プロパティを開き、`セキュリティ` タブに移動し、 `Edit -< Anonymous access and authentication control` 。

  この問題を解決するには `Anonymous Access` のチェックをはずして `Integrated Window Authentication` をチェックしたままにしておきか、 あるいは `Anonymous Access` をチェックしてアクセスできないユーザーを別途指定します。

どうすればXMLとPHPは共存することが出来るのですか？XMLの <?xml>タグがPHPでエラーになります。

  <?xml を直接PHPコードに埋め込むには、 PHPディレクティブのshort_tags を `0` に設定しなければなりません。 このディレクティブはini_set()でセットすることは できません。short_open_tags のオン/オフに関わらず、次のようにもできます: `<?php echo '<?xml'; ?>` このディレクティブはデフォルトでオンです。

あらかじめ設定されている変数を全て網羅したリストはどこにあるので すか？なぜPHPのドキュメントにはその一覧がないのですか？

  マニュアルの 定義済みの変数 のページを読んでください。スクリプト上で有効な定義済み変数のリストの 一部があります。有効な変数の完全なリスト（とその詳しい情報）は phpinfo()をコールすることで見ることができます。 マニュアルの PHPの外部から来る変数 のセクションも読んでください。HTMLフォームやCookie、URL等から 来る外部変数に関するシナリオが説明されています。

フリーではない商用ライブラリである PDFLib を使わずに PDFファイルを生成するにはどうしたらよいでしょうか？ フリーのもので、外部のPDFライブラリが不要なものがいいのですが。

  PHPで書かれている代替手段がいくつかあります。 » FPDF や » TCPDF などです。

いくつかの PHP ディレクティブでは、バイト値を int ではなく省略形で設定できます。この省略形で使えるオプションを教えてください。

  有効なオプションは K（キロバイト）、M（メガバイト）および G（ギガバイト) です。これらはすべて、大文字小文字を区別しません。 これ以外の文字はバイト値と判断されます。 `1M` は、1 メガバイトあるいは `1048576` バイトと等しくなります。`1K` は、1 キロバイトあるいは `1024` バイトです。この表記法は、 php.ini や ini_set() 関数で使えます。 ここで、数値の値は、int 型にキャストされることに注意して下さい。 たとえば、`0.5M` は `0` と解釈されます。

  > 注意: キロバイト? キビバイト?

  > PHP の記法では 1 キロバイト = 1024 バイトとしていますが、 IEC の標準規格では 1024 バイトのことを 1 キビバイト (kibibyte) と呼ぶことになっています。 まとめ: PHP での k および K = 1024 バイト。

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open