特記事項 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 を使ったクラス






