サーバー側のタスクは通常、クライアントの要求に従って論理演算を実行し、結果の応答を返すことです。この応答は通常 XML 形式です (そのため、サーバー側は PHP の DOM を使用して XML 応答を作成する必要があります)。
1. PHP は DOM を使用して XML 応答を作成し、クライアントの JS によって解析されてページに表示されます。 PHP の DOM API に習熟している必要があります)
実際、PHP で XML を生成するには 2 つの方法があります。
DOM API を使用する (方法 1)
もう 1 つは、XML コンテンツを直接エコーすることです (方法 2)。
例を参照してください:
HTML ページ (3 つの JS トリガー関数: onmouseover、onmouseout、onclick が含まれており、それぞれ独自の関数をトリガーします)
<!doctype html public "-//w3c//dtd html 4.0 tRANSITIONAL//en">
<html>
<頭>
<title> サーバー PHP Ajax </title>
<script type="text/javascript" src="js.js"></script>
</head>
<body>
<span onmouseover="PHPechoXML()" onmouseout="PHPDOMXML()">デフォルトの単語</span>
<div id="show"></div>
<input type="text" id="firstNumber"/>で割る
<input type="text" id="秒番号"/>
<input type="button" value="送信" onclick="CSparameter()"/>
<div id="結果"></div>
</body>
</html>
JS ページ (3 つの JS トリガー関数をそれぞれ定義: PHPechoXML、PHPDOMXML、CSparameter)
XMLHttpRequest オブジェクト作成関数とそれぞれのサーバー応答処理関数があります。
///////1. XMLHttpRequest オブジェクトを作成します。
var xmlHttp = createXmlHttpRequestObject()
関数 createXmlHttpRequestObject();
...{
var xmlHttp;
試してください。
...{
// XMLHttpRequest オブジェクトを作成してみます
xmlHttp = 新しい XMLHttpRequest();
}
キャッチ(e)
...{
// IE6 以降を想定します
var XmlHttpVersions = new Array('MSXML2.XMLHTTP.6.0',
'MSXML2.XMLHTTP.5.0',
'MSXML2.XMLHTTP.4.0',
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP');
for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
...{
試す
...{
// XMLHttpRequest オブジェクトを作成してみます
xmlHttp = 新しい ActiveXObject(XmlHttpVersions[i]);
}
キャッチ (e) ...{}
}
}
if (!xmlHttp)
alert("XMLHttpRequest オブジェクトの作成中にエラーが発生しました。");
それ以外
xmlHttp を返します。
}
///////2. JavaScriptイベント応答関数(onmouseoverトリガー)
// サーバーからファイルを読み取ります
関数PHPichoXML()
...{
// xmlHttp が void でない場合のみ続行します
if(xmlHTTP)
...{
// サーバーへの接続を試みます
試す
...{
//サーバーからのファイルの読み取りを開始します
//サーバー側のPHPechoXML.phpファイルに非同期リクエストを送信します。
xmlHttp.open("GET", "PHPechoXML.php", true);
xmlHttp.onreadystatechange = handleRequestStateChange;
xmlHttp.send(null);
}
// 失敗した場合はエラーを表示する
キャッチ (e)
...{
alert("サーバーに接続できません: " + e.toString());
}
}
}
///////3. JavaScript イベント応答関数 (onmouseout トリガー)
functionPHPDOMXML()
...{
// xmlHttp が void でない場合のみ続行します
if(xmlHTTP)
...{
// サーバーへの接続を試みます
試す
...{
//サーバーからのファイルの読み取りを開始します
//サーバー側の PHPDOMXML.php ファイルに非同期リクエストを送信します
xmlHttp.open("GET", "PHPDOMXML.php", true);
xmlHttp.onreadystatechange = handleRequestStateChange;
xmlHttp.send(null);
}
// 失敗した場合はエラーを表示する
キャッチ (e)
...{
alert("サーバーに接続できません: " + e.toString());
}
}
}
// サーバーから受信した応答を処理する、サーバー側のステータス コールバック関数
関数 handleRequestStateChange()
...{
if (xmlHttp.readyState == 4)
...{
// HTTP ステータスが「OK」の場合のみ続行
if (xmlHttp.status == 200)
...{
試す
...{
// サーバーからメッセージを読み取ります
var xmlResponse = xmlHttp.responseXML;
//IE および Opera の潜在的なエラーをキャプチャします。
if(!xmlResponse||!xmlResponse.documentElement)
...{
throw("無効な XML 構造: "+xmlHttp.responseText);
}
//FireFox の潜在的なエラーをキャプチャします
var rootNodeName=xmlResponse.documentElement.nodeName;
if(rootNodeName=="パーサーエラー")
...{
throw("無効な XML 構造: "+xmlHttp.responseText);
}
//サーバーから XML 応答を取得し、解析して、Web ページに表示します
//XMLのドキュメント要素を取得します
xmlRoot = xmlResponse.documentElement;
// 本のタイトルと ISBN を含む配列を取得します
cityArray=xmlRoot.getElementsByTagName("都市");
//HTML出力を生成する
var html = "";
// 配列を反復処理し、HTML 構造を作成します
for (var i=0; i<cityArray.length; i++)
html += cityArray.item(i).firstChild.data + "<br/>";
// ページ上の <div> 要素への参照を取得します
myDiv = document.getElementById("show");
// HTML出力を表示します
myDiv.innerHTML = "サーバーは次のように言います:<br />" + html;
}
キャッチ(e)
...{
// エラーメッセージを表示する
alert("応答の読み取りエラー: " + e.toString());
}
}
それ以外
...{
//ステータスメッセージを表示
alert("データの取得中に問題が発生しました: " +
xmlHttp.statusText);
}
}
}
///////4. JavaScriptイベント応答関数(onclickトリガー)
関数 CSparameter()
...{
// xmlHttp が void でない場合のみ続行します
if(xmlHTTP)
...{
// サーバーへの接続を試みます
試す
...{
//フォーム内の値を取得します
var firstNumber=document.getElementById("firstNumber").value;
var SecondNumber=document.getElementById("secondNumber").value;
// サーバー側で CSparameter.php に非同期リクエストを行うためのパラメータとして設定します
。
var param="firstNumber="+firstNumber+"&secondNumber="+secondNumber;
// サーバーからのファイルの読み取りを開始します
。
xmlHttp.open("GET", "CSparameter.php?"+param, true);
xmlHttp.onreadystatechange = handleRequestStateChangePara;
xmlHttp.send(null);
}
// 失敗した場合はエラーを表示する
キャッチ (e)
...{
alert("サーバーに接続できません: " + e.toString());
}
}
}
//サーバーステータス変更コールバック関数(サーバーはクライアントからパラメータを受け取り、論理計算後にXML応答を返します。クライアントはXMLを解析し、更新をページに返します)
// サーバーから受信した応答を処理します
関数 handleRequestStateChangePara()
...{
if (xmlHttp.readyState == 4)
...{
// HTTP ステータスが「OK」の場合のみ続行
if (xmlHttp.status == 200)
...{
試す
...{
// サーバーからメッセージを読み取ります
var xmlResponse = xmlHttp.responseXML;
//IE と Opera の潜在的なエラーをキャプチャします
if(!xmlResponse||!xmlResponse.documentElement)
...{
throw("無効な XML 構造: "+xmlHttp.responseText);
}
//FireFox の潜在的なエラーをキャプチャします
var rootNodeName=xmlResponse.documentElement.nodeName;
if(rootNodeName=="パーサーエラー")
...{
throw("無効な XML 構造: "+xmlHttp.responseText);
}
//XMLのドキュメント要素を取得します
xmlRoot = xmlResponse.documentElement;
cityArray=xmlRoot.getElementsByTagName("結果");
//HTML出力を生成する
var html = "";
// 配列を反復処理し、HTML 構造を作成します
for (var i=0; i<cityArray.length; i++)
html += cityArray.item(i).firstChild.data + "<br/>";
// ページ上の <div> 要素への参照を取得します
myDiv = document.getElementById("結果");
// HTML出力を表示します
myDiv.innerHTML = "サーバーは次のように言います:<br />" + html;
}
キャッチ(e)
...{
// エラーメッセージを表示する
alert("応答の読み取りエラー: " + e.toString());
}
}
それ以外
...{
//ステータスメッセージを表示
alert("データの取得中に問題が発生しました: " +
xmlHttp.statusText);
}
}
(
クライアントからの非同期リクエストを受け入れ、それに応答し、XML 形式でクライアントに返すことを担当します)
PHEchoXML.php (PHP が XML 応答を生成する最初のメソッド。XML コンテンツをエコー出力します)
<?php
//サーバーサイド PHP が XML ファイルを生成する最初の方法は、XML を直接エコーすることです。
header('Content-Type: text/xml');
//XMLヘッダーを生成する
echo '<?xml version="1.0"coding="UTF-8"standalone="yes"?>';
echo '<都市>';
$cityArray=array('パリ','ロンドン','ニューヨーク','北京','トコイ');
foreach ($cityArray として $city)
{
echo '<city>'.$city.'</city>';
}
echo '</cities>';
?>
PHPDOMXML.php (PHP が XML 応答を生成する 2 番目の方法。PHP の DOM API を使用して XML 形式で応答を出力します)
<?php
header('Content-Type: text/xml');
$cityArray=array('上海','北京','山西','山東');
//XMLドキュメントを作成する
$dom=新しい DOMDocument();
//最も外側のタグ
$citiesTag=$dom->createElement('cities');
$dom->appendChild($citiesTag);
// 内部のタグはループを通じて生成できます
foreach ($cityArray として $city)
{
$cityTag=$dom->createElement('city');
$cityName=$dom->createTextNode($city);
$cityTag->appendChild($cityName);
$citiesTag->appendChild($cityTag);
}
//XML構造を文字列として保存して出力する
$xmlString=$dom->saveXML();
エコー$xmlString;
?>
2. クライアント側とサーバー側の間のパラメータ転送:
クライアント側の Web ページにはフォームがあり、パラメータをサーバー側の <GET または POST メソッド、変数、または XML> に渡すことができ、サーバー側は次の要件を満たす XML 応答を生成します。渡されたパラメータ (実装されたクライアント側パラメータとサーバー側パラメータ)
例を参照してください:
1と同様、パラメータを渡すためのPHP側のスクリプトは次のとおりです。 CSparameter.php (クライアントフォームの非同期リクエストのパラメータを受け取り、論理処理を実行し、クライアントに返すXMLレスポンスを生成します) <?php
//サーバー側のエラー処理関数をカスタマイズする
require_once('error_handler.php');
header('Content-Type: text/xml');
//クライアントの非同期リクエストのパラメータを受け入れます
$firstNumber=$_GET['firstNumber'];
$secondNumber=$_GET['secondNumber']
// 論理計算を実行します
。
$result=$firstNumber/$secondNumber;
// XML 形式で応答を生成し、クライアントに返します。
$dom=新しい DOMDocument();
$resultsTag=$dom->createElement('results');
$dom->appendChild($resultsTag);
$resultTag=$dom->createElement('result');
$resultText=$dom->createTextNode($result);
$resultTag->appendChild($resultText);
$resultsTag->appendChild($resultTag);
$xmlString=$dom->saveXML();
エコー $xmlString
?>
3. PHP 側でのエラー例外の処理 (ここで言及するエラーまたは例外は論理エラーを指します):
a) デフォルトでは、PHP はエラーまたは例外が発生しても例外をスローしません (これは、php.ini のデフォルトの display_errors が off に設定されており、エラーは Apache エラー ログ レコードに保存されるためです)。デバッグが難しいと書かれています。 <ブラウザに表示されるエラーを見つけるのは難しいことがよくあります>
b) ただし、display_errors が on に設定されている場合、エラーは表示されますが、エラー メッセージは不親切になります。
http://www.downcodes.com/
c) 独自の PHP エラー例外処理関数 (display_errors を on に設定する必要はありません) を作成して、デバッグを容易にするためにエラーをわかりやすい方法で表示できます。
通常は、次のように独自の例外処理関数を作成します。
定義されたサーバー側エラー例外スロー関数 error_handler.php を表示します (PHP プログラムで簡単に再利用できます)
<?php
// ユーザー定義のエラーハンドラー関数を設定します ユーザー定義のエラー例外処理メソッドを設定します
set_error_handler('error_handler', E_ALL);
関数 error_handler($errNo,$errStr,$errFile,$errLine)
{
//出力バッファが空でない場合は空にする
if(ob_get_length()) ob_clean();
//カスタム出力を定義する
$error_message='ERRNO: '.$errNo.chr(10).'TEXT: '.$errStr.chr(10).'LOCATION: '.$errFile.', Line'.$errLine;
$error_message をエコーします。
出口;
}
?>
4. データベースへのサーバー側アクセス <真のダイナミクスを実現するために MySQL を使用してデータにアクセス>
これはすでに非常に古典的なもので、MySQL、MSSQL、Oracle などを使用できます。
a) データベースを開く b) SQL ステートメント クエリ c) データベースを閉じる
5. サーバー側 PHP プログラムのカプセル化とアーキテクチャ (サーバー側 PHP プログラムはデザイン モードを導入します)
a) appname.php <クライアント要求を受け入れる>
b) appname.class.php <サーバー側ロジック、データベース操作、エラー処理などを、属性、メソッド、コンストラクター、デストラクターを含むクラスにカプセル化>
c) config.php
d) error_handler.php
は、サーバー側に設計パターンを導入する例です: (スケーラビリティと再利用性を強化するために、サーバー側 PHP スクリプトのプログラム アーキテクチャを設計します)
非常に単純なキーワード提案プログラム: (index.html、css/style.css、js.js および PHP コード php/suggest.php、suggest.class.php、error_handler.php、config.php を含むデータベース)
Index.html(css/style.css, js.js; 2 つの JS クライアント イベントが onkeyup と onclick をトリガーすることに注意してください)
onkeyup は、ユーザーが入力するとサーバーにリクエストをリアルタイムで非同期に送信し、onclick はユーザーが検索をクリックするとサーバーにリクエストを送信します。
<!doctype html public "-//w3c//dtd html 4.0 tRANSITIONAL//en">
<html>
<頭>
<title> デザイン パターン PHP AJAX (キーワードはデモを示唆します) </title>
<link type="text/css" rel="stylesheet" href="css/style.css"/>
<script type="text/javascript" src="js.js"></script>
</head>
<本文>
<スクリプトなし>
<strong>この例では JavaScript 対応のブラウザが必要です。</strong>
</noscript>
<div class="プロジェクト">
<span class="title">デザイン パターン PHP AJAX へようこそ (キーワードはデモを示唆します) </span>
<br />
<br />
<div class="ニュース">
<br /><input type="text" id="keyword" onkeyup="keyup()" /><input type="button" id="search" onclick="search()" value="search"> <br /><br />
キーワードを提案します:
<div id="show"></div>
</div>
</div>
</body>
</html>
css/スタイル.css
体
{...}{
フォントファミリー: Arial;
フォントサイズ: 小;
背景色: #fff;
}
。タイトル
{...}{
フォントサイズ:x-large;
}
ディビジョンプロジェクト
{...}{
背景色: #99ccff;
パディング:5px;
ボーダー:#000099 1px ソリッド;
}
ディビジョンニュース
{...}{
背景色:#fffbb8;
パディング:2px;
境界線: 1 ピクセルの破線。
}
#見せる
{...}{
色: #008000;
フォント スタイル: イタリック体。
}js.js (クライアントがサーバーの応答を処理するための JS での応答関数とコールバック関数を定義)
//////////////////////////////////////////////// /// /////////
//1. XMLHttpRequest オブジェクトを作成します。
//////////////////////////////////////////////// /// /////////
var xmlHttp = createXmlHttpRequestObject();
関数createXmlHttpRequestObject()
...{
var xmlHttp;
試す
...{
// XMLHttpRequest オブジェクトを作成してみます
xmlHttp = 新しい XMLHttpRequest();
}
キャッチ(e)
...{
// IE6 以降を想定します
var XmlHttpVersions = new Array('MSXML2.XMLHTTP.6.0',
'MSXML2.XMLHTTP.5.0',
'MSXML2.XMLHTTP.4.0',
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP');
for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
...{
試す
...{
// XMLHttpRequest オブジェクトを作成してみます
xmlHttp = 新しい ActiveXObject(XmlHttpVersions[i]);
}
キャッチ (e) ...{}
}
}
if (!xmlHttp)
alert("XMLHttpRequest オブジェクトの作成中にエラーが発生しました。");
それ以外
xmlHttp を返します。
}
// show という ID を持つ div に対するサーバーからの正しい応答を表示します
機能表示(メッセージ)
...{
showDIV=document.getElementById("show");
showDIV.innerHTML=メッセージ;
}
// show という ID の div に対するサーバー側の応答のエラー メッセージを表示します
関数displayError(エラーメッセージ)
...{
// エラーメッセージを表示する
display("新しいメッセージの取得中にエラーが発生しました!<br/>"+errormessage);
}
//////////////////////////////////////////////// /// //////////
//2. イベント駆動関数(キーアップ関数)
//////////////////////////////////////////////// /// /////////
var keyupAddress="php/suggest.php?action=keyup&keyword=";
関数キーアップ()
...{
if(xmlHTTP)
...{
//サーバーがビジーでないときに非同期リクエストを送信します
if(xmlHttp.readyState==0||xmlHttp.readyState==4)
...{
試す
...{
var キーワード=document.getElementById("キーワード").value;
//非同期リクエストを行う
xmlHttp.open("GET",keyupAddress+キーワード,true);
xmlHttp.onreadystatechange=handlereadystatechange;
xmlHttp.send(null);
}
キャッチ(e)
...{
displayError(e.toString);
}
}
}
}
//////////////////////////////////////////////// /// /////////
//3. コールバック関数。この関数はサーバーの応答ステータスが変化したときにトリガーされます。
//////////////////////////////////////////////// /// /////////
関数ハンドルreadystatechange()
...{
if(xmlHttp.readyState==4)
...{
if(xmlHttp.status==200)
...{
試す
...{
//サーバーレスポンスを取得する
var xmlResponse = xmlHttp.responseXML;
assignArray=xmlResponse.getElementsByTagName("提案");
var showText="";
for(var i=0;i<suggestArray.length;i++)
...{
var textNodes=suggestArray[i].getElementsByTagName("テキスト");
var timeNodes=suggestArray[i].getElementsByTagName("times");
for(var j=0;j<textNodes.length;j++)
...{
showText+=textNodes[j].childNodes[0].nodeValue+" ("+timesNodes[j].childNodes[0].nodeValue+") <br />";
}
}
// ページへの応答を表示します
表示(showText);
}
キャッチ(e)
...{
displayError(e.toString());
}
}
}
}
//////////////////////////////////////////////// /// /////////
//2. イベント駆動関数(検索関数)
//////////////////////////////////////////////// /// /////////
var searchAddress="php/suggest.php?action=search&keyword=";
関数検索()
...{
if(xmlHTTP)
...{
//サーバーがビジーでないときに非同期リクエストを送信します
if(xmlHttp.readyState==0||xmlHttp.readyState==4)
...{
試す
...{
var キーワード=document.getElementById("キーワード").value;
//非同期リクエストを行う
xmlHttp.open("GET",検索アドレス+キーワード,true);
xmlHttp.onreadystatechange=handlereadystatechange;
xmlHttp.send(null);
}
キャッチ(e)
...{
displayError(e.toString);
}
}
}
}
最後に: サーバーサイド PHP スクリプトのプログラム構造 (suggest.php がサーバーサイドの主要な処理関数であり、他にsuggest.class.php、error_handler.php、config.phpなどもあります)
assign.php (クライアントのパラメータを取得し、suggest クラスの 2 つのメソッドを呼び出して XML 形式で応答を生成し、クライアントに送り返します)
<?php
require_once('suggest.class.php');
header('Content-Type: text/xml');
// ユーザーのブラウザが結果をキャッシュしないようにします
header('有効期限: 1980 年 12 月 23 日水曜日 00:30:00 GMT');
header('Last-Modified: '.gmdate('D, d MYH:i:s').' GMT' );
header('キャッシュ制御: キャッシュなし、再検証が必要');
header('プラグマ: キャッシュなし');
$action=$_GET['action'];
$keyword=$_GET['keyword'];
$oSuggest=新しい提案();
if($action=='キーアップ'&&$キーワード!='')
{
$suggestXML=$oSuggest->getSuggests($keyword);
}
if($action=='検索'&&$キーワード!='')
{
$suggestXML=$oSuggest->submitKeyword($keyword);
}
$suggestXML をエコーします。
?>suggest.class.php クラス
<?php
require_once('error_handler.php');
require_once('config.php');
クラスの提案
{
//メンバ変数
private $conn;
//コンストラクター、データベースリンク
function__construct()
{
$this->conn=new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_DATABASE);
if (mysqli_connect_errno()) {
printf("接続に失敗しました: %s ", mysqli_connect_error());
出口();
}
}
//デストラクター、データベースリンクを切断します
関数__destruct()
{
$this->conn->close();
}
//getSuggests メンバー関数 (この関数は主にクライアント側の action=keyup、つまりユーザーが入力しているときの非同期リクエストに応答します)
パブリック関数 getSuggests($keyword)
{
//提案の生成(入力されたキーワードの前半と同じキーワードをデータベース内に生成します)
$suggest_query='選択 * キーワードから ''.$keyword.'%' のようなキーワードは、説明の制限 5 倍で並べ替えます';
$suggest_result=$this->conn->query($suggest_query);
$suggest_num=$suggest_result->num_rows;
$strOUT='<?xml version="1.0" encoding="UTF-8" スタンドアロン="yes"?>';
if($suggest_num==0)
{
//$strOUT=$strOUT.'<suggests><suggest><text>'.$keyword.'</text><times>0</times></suggest></suggests>';
}
それ以外
{
$strOUT=$strOUT."<提案>";
for($i=0;$i<$suggest_num;$i++)
{
$suggest_row = $suggest_result->fetch_row();
$strOUT=$strOUT.'<suggest><text>'.$suggest_row[1].'</text><time>'.$suggest_row[2].'</time></suggest>';
}
$strOUT=$strOUT.'</suggests>';
}
$strOUT を返します。
}
//submitKeyword メンバー関数 (この関数は主にクライアント側の action=search、つまりユーザーが検索をクリックしたときの非同期リクエストに応答します)
パブリック関数 submitKeyword($keyword)
{
$select_query='select * from キーワード where キーワード=''.$keyword.''';
$select_result=$this->conn->query($select_query);
$select_num=$select_result->num_rows;
//新しいキーワードが見つかったらデータベースに追加し、既存のキーワードが見つかったらその数を増やします。
$strOUT='<?xml version="1.0"coding="UTF-8"standalone="yes"?>';
//既に存在するので回数を増やす
if($select_num!=0)
{
$select_row = $select_result->fetch_row();
$times_now=$select_row[2];
$times_now=$times_now+1;
$update_query='更新キーワード設定時間 ='.$times_now.' where キーワード=''.$keyword.'';
$update_result=$this->conn->query($update_query);
$strOUT=$strOUT.'<suggests><suggest><text>'.$keyword.'</text><times>'.$times_now.'</times></suggest></suggests>';
}
それ以外
{
//保存挿入なし
$insert_query='キーワード(キーワード, 回数) の値に挿入 (''.$keyword.'',1)';
$insert_result=$this->conn->query($insert_query);
$strOUT=$strOUT.'<suggests><suggest><text>'.$keyword.'</text><times>1</times></suggest></suggests>';
}
$strOUT を返します。
}
}
?>
最後の 2 つの関数 config.php は、アプリケーション構成情報 (データベース構成情報など) を保存します。
<?php
定義('DB_HOST', 'ローカルホスト');
定義('DB_USER','phpajaxuser');
定義('DB_PASSWORD','phpajaxuser');
定義('DB_DATABASE','phpajax');
?>
error_handler.php はカスタム例外処理を保存します
<?php
// ユーザー定義のエラー処理関数を設定します
set_error_handler('error_handler', E_ALL);
関数 error_handler($errNo,$errStr,$errFile,$errLine)
{
if(ob_get_length()) ob_clean();
$error_message='ERRNO: '.$errNo.chr(10).'TEXT: '.$errStr.chr(10).'LOCATION: '.$errFile.' '.$errLine;
$error_message をエコーします。
出口;
}
?>最後に、キーワードをデータベースに保存するためにデータベースを追加する SQL ステートメントが必要です。
CREATE TABLE `キーワード` (
`id` int(10) unsigned NOT NULL auto_increment,
`キーワード` varchar(32) NOT NULL デフォルト '',
`times` int(10) unsigned NOT NULL デフォルト '0'、
主キー (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1;
6. 将来の研究のために、PHP についての知識がほとんどありません。
PHP がリモート サーバーからデータを読み取る方法 (Web クロールに似ています):
ファイル取得コンテンツ;
または CURL<クライアント URL ライブラリ>www.php.net/curl