特記事項 1) ブラウザの JavaScript からドメイン違いでも呼び出せるように、Access-Control-Allow-Origin を使用 2) pretty=no で、整形しません。escape=no で、日本語はそのまま返します(デバッグ優先) real_escape_string で SQLインジェクション対策 SQL の実行に query メソッドを使用します。その為、SQL は単純に文字列で作成するので、real_escape_string で条件内の値を $_GET より $get に変換して使用します。
<?php error_reporting( E_ALL & ~E_NOTICE ); session_cache_limiter('nocache'); session_start(); // 取得対象列 $list = "社員コード,氏名,フリガナ,所属,性別,作成日,更新日,給与,手当,管理者"; // json encode オプション $flg = 0; // JavaScript ajax 用 header( "Access-Control-Allow-Origin: *" ); header( "Content-Type: application/json; charset=utf-8" ); // DB 接続 $mysqli = new mysqli('サーバ', 'ユーザ', 'パスワード', 'データベース'); if ( $mysqli->connect_error ) { // 接続失敗 $json = array( "error" => "Connect Error ({$mysqli->connect_errno}) {$mysqli->connect_error}" ); } else { // SQL インジェクション用 foreach( $_GET as $key => $value ) { // $_GET を $get で代替 $get[$key] = $mysqli->real_escape_string( $value ); } // json encode オプション if ( $get["pretty"] != "no" ) { $flg = $flg | JSON_PRETTY_PRINT; } if ( $get["escape"] != "no" ) { $flg = $flg | JSON_UNESCAPED_UNICODE; } $mysqli->set_charset("utf8"); // ~E_NOTICE なので、単純化 if ( $_GET["name"] == "" ) { $query = "select {$list} from 社員マスタ"; } else { $query = "select {$list} from 社員マスタ"; // 条件オプション $query .= " where 氏名 like '%{$get["name"]}%'"; } $result = $mysqli->query($query); if ( $result === false ) { // SQL 失敗 $json = array( "error" => "$mysqli->error : {$query}" ); } else { // DB 読み出し成功 $json = $result->fetch_all( MYSQLI_ASSOC ); } } print json_encode( $json, $flg ); ?>
bind_param で SQLインジェクション対策 prepare メソッドを使用すると、bind_param メソッドを使用して入力値から SQL を作成する事ができます。そして、結果として get_result メソッド を使用する事によって mysqli_result を取得できるので、その後は パターン(1) と同じになります
<?php error_reporting( E_ALL & ~E_NOTICE ); session_cache_limiter('nocache'); session_start(); // 取得対象列 $list = "社員コード,氏名,フリガナ,所属,性別,作成日,更新日,給与,手当,管理者"; // json encode オプション $flg = 0; // JavaScript ajax 用 header( "Access-Control-Allow-Origin: *" ); header( "Content-Type: application/json; charset=utf-8" ); // DB 接続 $mysqli = new mysqli('サーバ', 'ユーザ', 'パスワード', 'データベース'); if ( $mysqli->connect_error ) { // 接続失敗 $json = array( "error" => "Connect Error ({$mysqli->connect_errno}) {$mysqli->connect_error}" ); } else { // json encode オプション if ( $_GET["pretty"] != "no" ) { $flg = $flg | JSON_PRETTY_PRINT; } if ( $_GET["escape"] != "no" ) { $flg = $flg | JSON_UNESCAPED_UNICODE; } $mysqli->set_charset("utf8"); // ~E_NOTICE なので、単純化 if ( $_GET["name"] == "" ) { $query = "select {$list} from 社員マスタ"; } else { $query = "select {$list} from 社員マスタ"; // 条件オプション $query .= " where 氏名 like ?"; } // SQL 準備 $stmt = $mysqli->prepare($query); if ( $stmt === false ) { // SQL 失敗 $json = array( "error1" => "$mysqli->error : {$query}" ); } else { // バインドは変数で $param = "%{$_GET["name"]}%"; // パラメータの数が一致しない場合の warning を出さない為の @ 抑制 @$stmt->bind_param('s', $param ); if ( false === $stmt->execute() ) { $json = array( "error2" => "$mysqli->error" ); } else { // MySQL ネイティブドライバ限定(PHP 5.3.0 以降) $result = $stmt->get_result(); if ( $result === false ) { $json = array( "error3" => "$mysqli->error" ); } else { // DB 読み出し成功 $json = $result->fetch_all( MYSQLI_ASSOC ); } } } } print json_encode( $json, $flg ); ?>
get_result メソッド を使え無い場合の方法 get_result メソッドは、MySQL ネイティブドライバ限定(PHP 5.3.0 以降)なので、代替方法です。$stmt->store_result() => $stmt->bind_result => $stmt->fetch という流れになります。
<?php error_reporting( E_ALL & ~E_NOTICE ); session_cache_limiter('nocache'); session_start(); // 取得対象列 $list = "社員コード,氏名,フリガナ,所属,性別,作成日,更新日,給与,手当,管理者"; // json encode オプション $flg = 0; // JavaScript ajax 用 header( "Access-Control-Allow-Origin: *" ); header( "Content-Type: application/json; charset=utf-8" ); // DB 接続 $mysqli = new mysqli('サーバ', 'ユーザ', 'パスワード', 'データベース'); if ( $mysqli->connect_error ) { // 接続失敗 $json = array( "error" => "Connect Error ({$mysqli->connect_errno}) {$mysqli->connect_error}" ); } else { // json encode オプション if ( $_GET["pretty"] != "no" ) { $flg = $flg | JSON_PRETTY_PRINT; } if ( $_GET["escape"] != "no" ) { $flg = $flg | JSON_UNESCAPED_UNICODE; } $mysqli->set_charset("utf8"); // ~E_NOTICE なので、単純化 if ( $_GET["name"] == "" ) { $query = "select {$list} from 社員マスタ"; } else { $query = "select {$list} from 社員マスタ"; // 条件オプション $query .= " where 氏名 like ?"; } // SQL 準備 $stmt = $mysqli->prepare($query); if ( $stmt === false ) { // SQL 失敗 $json = array( "error1" => "$mysqli->error : {$query}" ); } else { // バインドは変数で $param = "%{$_GET["name"]}%"; // パラメータの数が一致しない場合の warning を出さない為の @ 抑制 @$stmt->bind_param('s', $param ); if ( false === $stmt->execute() ) { $json = array( "error2" => "$mysqli->error" ); } else { // get_result() を使わない方法 $stmt->store_result(); $row_data = new StdClass; $stmt->bind_result( $row_data->{"社員コード"}, $row_data->{"氏名"}, $row_data->{"フリガナ"}, $row_data->{"所属"}, $row_data->{"性別"}, $row_data->{"作成日"}, $row_data->{"更新日"}, $row_data->{"給与"}, $row_data->{"手当"}, $row_data->{"管理者"} ); $json = array(); while ($stmt->fetch()) { $json[] = $row_data; } } } } print json_encode( $json, $flg ); ?>
|
【PHP + データベースの最新記事】
- PDO MySQL のバインドを使用した標準的な記述( ロリポップ )
- PHP で MySQLをテストする為のソースコード
- PHP で ODBC 関数を使って MS Access( データベース )にアクセスして結果を JSON 文字列として出力する
- Windows 環境の MySQL + PHP で、ODBC ドライバを使用してデータを取得する場合の3パターン
- PHP で 自家製 API を作成して jQuery の簡単なコードで更新処理を行うサンプル
- PHP : PIPES_AS_CONCAT を使用して、CSV 作成処理をサーバの負荷にして高速に WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP : WrodPress のデータを insert SQL で保存する処理
- PHP : WrodPress のデータを Excel で読み込める CSV として保存する処理
- PHP で MySQLi 使用時の データ型定数( MYSQLI_TYPE_ ) の詳細 ( バックアップ用 insert 文を作る為 )
- PHP から MySQL の簡易的なバックアップを取得する( 但し、DBサーバがディスクへの書き込み権限を持っている必要があります )
- PHP : JSON 文字列で定義されたフォーマットを元に、そのフォーマットにセットされた配列を使って insert と update の SQL 文を自動作成。
- PHP : PDO のエラー処理
- PHPのマニュアルにある、SQLインジェクション攻撃の例
- PHP : SQLite3 を PDO の ODBC 経由で読み込み
- PHP : 5.3 / 5.2.11 用共用 sqlite3(日本語テーブル) 読み込み
- PHP : Oracle を処理する COM を使ったクラス