国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ php教程 php手冊(cè) 大きなスクラッチ PDO を手に入れました (2)

大きなスクラッチ PDO を手に入れました (2)

Jul 06, 2016 pm 01:30 PM
ルームメイト 昨日

こんにちは昨日も213時(shí)でした。ルームメイトが3時(shí)過(guò)ぎまで寢なかったことが客観的に影響しましたが、根本的な理由は昨夜勉強(qiáng)したくなかったということです。今日から始めましょう。 PDO と Ajax の學(xué)習(xí)は 3 ~ 4 日以?xún)?nèi)に終えるつもりです。また怠けることがないように、皆さんが何もできなかったら叱りに來(lái)てください。 1. PDO 2. PDO オブジェクトの使用 (2) 2.2 エラーメッセージ errorCode() errorInfo(

)

こんにちは

昨日も213時(shí)でした。ルームメイトが3時(shí)過(guò)ぎまで寢なかったことが客観的に影響しましたが、根本的な理由は昨夜勉強(qiáng)したくなかったということです。今日から始めましょう。 PDO と Ajax の學(xué)習(xí)は 3 ~ 4 日以?xún)?nèi)に終えるつもりです。また怠けることがないように、皆さんが何もできなかったら叱りに來(lái)てください。

1、PDO

2. PDOオブジェクトの使用(2)

2.2 エラーメッセージ

errorCode()—エラー番號(hào);

errorInfo() - エラーメッセージ

栗をください

/*

* PDO エラー メッセージ
*/

$pdo=新しい PDO('MySQL:host=localhost;dbname=imooc','root','');

$pdo->exec('imooc_pdoを使用');

$resultd=$pdo->exec('id=13のユーザーから削除');

var_dump($resultd);
$insert='ユーザーを挿入(ユーザー名,パスワード,メールアドレス) 値("Knga","'.md5('king').'","shit@shit.com")';
$result1=$pdo->exec($insert) ;
var_dump($result1);

if ($result1==false)

{ echo "エラーが発生しました";
echo $pdo->errorCode();
PRint_r($pdo->errorInfo());
}
エラーメッセージを見(jiàn)てください

配列 ( [0] => 23000 [1] => 1062 [2] => Duplicata du champ 'Knga' pour la clef 'username' )

0 はエラーの種類(lèi)、1062 はコード、2 はエラー メッセージです (これは、ユーザー名が一意のキーに設(shè)定されているためですが、ID 番號(hào)はまだ増加しているためです)。

2.3 query() はクエリを?qū)g裝します

ステートメントを?qū)g行

し、PDOstatement オブジェクトを返します。

--栗をください

/*

* PDOクエリ

*/

$pdo=新しい PDO('mysql:host=localhost;dbname=imooc','root','');

$pdo->exec('imooc_pdoを使用');

$insert='select * from user';

$result1=$pdo->query($insert);


var_dump($result1); // ステートメントオブジェクトを表示
foreach ($result1 as $row) { //出力結(jié)果を表示します(戻り?duì)顩rに従って)
print_r($row);}
if ($result1==false) {
echo "エラーが発生しました";
echo $pdo->errorCode ();
print_r($pdo->errorInfo());
}

SQL ステートメントに問(wèn)題がある場(chǎng)合、ステートメント オブジェクトは false になり、その後の出力もエラー メッセージになります。

SQL ステートメントは正しいが、クエリのコンテンツが存在しない場(chǎng)合、ステートメント オブジェクトは OK であり、出力は空です。

もちろん、この方法の方が見(jiàn)栄えが良くなります: foreach ($result1 as $row){ //出力結(jié)果を表示します(戻り?duì)顩rに従って)

// print_r($row);echo "
";

echo 'Number:'.$ row[' id'];echo "
";

echo 'ユーザー名:'.$row['ユーザー名'];echo "
";

echo 'パスワード:'.$ row[ 'パスワード'];echo "
";
echo 'Email:'.$row['email'];echo "
";
echo "


}

もちろん、クエリの追加、削除、変更は問(wèn)題ありません。

2.4 クエリを?qū)g裝するための prepare() メソッドとexecute() メソッド

推奨クエリ方法は條件付きクエリを?qū)g現(xiàn)できます。

prepare() - 実行する SQL ステートメントを準(zhǔn)備し、PDOstatement オブジェクトを返します。 execute()—準(zhǔn)備されたステートメントを?qū)g行し、

true または false を返します

; つまり、上記はペアです。

--例を挙げてください

/*

* PDOprepare&executeメソッド*/

$pdo=新しい PDO('mysql:host=localhost;dbname=imooc','root','');


$pdo->exec('imooc_pdoを使用');

$insert='select * from user where username="king"';

$result=$pdo->prepare($insert);

var_dump($result);


$result1=$result->execute();//プリペアドステートメントの実行ですvar_dump($result1);

print_r($result->fetchAll());//結(jié)果はステートメントオブジェクトにのみ出力できます

if ($result1==false) { echo "エラーが発生しました"; echo $pdo->errorCode();

print_r($pdo->errorInfo());

}

ここでこの特殊な狀況に事前に対処するように注意してください。そうすれば、ターゲットが誰(shuí)であるかを把握しやすくなります。


-- 出力形式を選択します

配列出力、すべてまたはインデックス配列を関連付けるには、パラメーターとメソッドという 2 つの異なる方法があります。

header('content-type:text/html;charset=utf-8');
try{
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root' ,'root');
$sql='select * from user';
$stmt=$pdo->prepare($sql);
$res=$stmt->execute();
// if( $res){
// while($row=$stmt->fetch(PDO::FETCH_ASSOC)){//連想配列の出力のみが必要です
// print_r($row);
// echo ' < ;hr/>';
// }
// }
// $rows=$stmt->fetchAll(PDO::FETCH_ASSOC);
// print_r($rows);
echo '


$stmt->setFetchMode(PDO::FETCH_ASSOC); //このメソッドを使用して、デフォルトのモードを設(shè)定することもできます
//var_dump($stmt);
$ rows=$ stmt->fetchAll();
print_r($rows);
}catch(PDOException $e){
echo $e->getMessage();
}

通常、配列にインデックスを付けたいと考えます。

2.5 データベース接続プロパティを設(shè)定する

setAttribute()—データベース接続屬性を設(shè)定します;

getAttribute()—データベース接続屬性を取得します;

--例を挙げてください

$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
echo "自動(dòng)コミット".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);echo "


";
//pdo はオブジェクトなので、プロパティを取得することを覚えておいてください。そして、その中には多くの屬性値が設(shè)定されており、これが屬性を取得するための前提となります。
echo "デフォルトのエラー処理モード:".$pdo->getAttribute(PDO::ATTR_ERRMODE);echo "


";
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0) ;
echo "オートコミット".$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);echo "
";

次に、大量の屬性情報(bào)を取得してみます:

$attrArr=array(
'AUTOCOMMIT','ERRMODE','CASE','PERSISTENT','SERVER_INFO','SERVER_VERSION'
);
foreach ($attrArr as $attr){
echo "PDO::ATTR_ $attr: ";
echo $pdo->getAttribute(constant("PDO::ATTR_$attr"))."
";
}

一部は利用できず、エラーメッセージが表示されますが、問(wèn)題ありません。

3. PDOstatement オブジェクトの使用

SQLインジェクションを防ぐための3.1 quote()メソッド

--SQL インジェクション

まず、この単純な SQL インジェクションを説明するための例を示します (実際にはよく理解していません - Baidu http://baike.baidu.com/link?url=jiMtgmTeePlWAqdAntWbk-wB8XKP8xS3ZOViJE9IVSToLP_iT2anuUaPdMEM0b-VDknjolQ8BdxN8ycNLohup_)

いわゆる SQL インジェクションとは、Web フォームの送信に SQL コマンドを挿入したり、ページ リクエストのドメイン名やクエリ文字列を入力したりして、最終的にサーバーをだまして悪意のある SQL コマンドを?qū)g行させることです。

そのため、フォームが必要で、データベースにデータなどのクエリを?qū)g行し、ルールの抜け穴を悪意を持って利用して、ページが予期していなかった大量のデータを取得する必要があります。栗は以下の通りです

例はログインです。ログインにはユーザー名、パスワードなどが必要で、データベース內(nèi)の情報(bào)と比較する必要があります。

まずは

ログインページです



$stmt=$pdo->query($sql);

echo $stmt->rowCount() ;//結(jié)果セットのステートメントオブジェクトの行數(shù)を表示します
} catch (PDOException $e) {
echo $e->getMessage();
}
次に、ブラウザでlogin.htmlを開(kāi)き、データベースにユーザー名とパスワードを入力し、「ログイン」をクリックすると、1を取得します。

間違った情報(bào)を入力すると、通常は 0 が返されます;

注:

ユーザー名または 1=1# とパスワードを自由に入力すると、データベース內(nèi)のすべてのデータを簡(jiǎn)単に取得できます。これは SQL ステートメント自體の規(guī)則によるものです。

そのため、ユーザーが入力した情報(bào)を フィルタリングする必要があり、ユーザーの操作をすべて信頼する必要はありません。

--対処方法

echo $pdo->quote($username);

この文を書(shū)いてから上記のチートコードを使用すると、出力にはさらに一重引用符が含まれ、次のものが自動(dòng)的に追加されます:

「または 1=1#」

ただし、これを行うと、$username への呼び出しが引用符付きで自動(dòng)的に追加されるため、次の SQL ステートメントはそれに応じて変更されます。

$username=$pdo->quote($username);

$pdo->exec('use imooc_pdo');
$sql="select * from user where username={$username} andpassword='{ $パスワード}'";

簡(jiǎn)単に言うと、

ユーザー名をタグ付けする データベースがある場(chǎng)合にはこれを警戒する必要があるようです。

ただし、この方法の使用はお?jiǎng)幛幛筏蓼护蟆?p>準(zhǔn)備+実行の前処理方法を使用することをお?jiǎng)幛幛筏蓼?strong>。

3.2 準(zhǔn)備されたステートメントでのプレースホルダーの使用

インジェクションを非常に適切に防止し、一度コンパイルして複數(shù)回実行することでシステムのオーバーヘッドを削減できます。

--プレースホルダー: (名前付きパラメータ) (推奨)

header('content-type:text/html;charset=utf-8');

$username=$_POST['username'];
$password=$_POST['password'];
try {
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
$pdo->exec('use imooc_pdo');
$sql="select *ユーザーから
ここで username=:username およびpassword=:$password
"; $stmt=$pdo->prepare($sql);
$stmt->execute(array(":username"=> $username,":password"=>$password));
//$stmt=$pdo->query($sql); echo $stmt->rowCount();//結(jié)果セットを表示するステートメント オブジェクト內(nèi)の行數(shù)

} catch (PDOException $e) {

echo $e->getMessage();

}

対応する SQL ステートメント、対応する実行、および渡す必要があるパラメーターも対応している必要があります。

--プレースホルダー?

$sql="ユーザー名 =? およびパスワード =? のユーザーから * を選択";

$stmt=$pdo->prepare($sql);
$stmt->execute(array($username, $パスワード));
気分?方法はもっとシンプルで、入力プレースホルダー + 前処理 + SQL ステートメントでの実行 (複數(shù)のデータを渡すには配列を使用) の 3 つのポイントだけです。

3.3 bindingParam() メソッドはパラメータをバインドします

パラメータを変數(shù)名にバインドします。

/*

* バインディングパラメータ
*/

header('content-type:text/html;charset=utf-8');

try {

$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
$pdo->exec('use imooc_pdo');

$sql="ユーザー(ユーザー名,パスワード,電子メール)の値を挿入(:ユーザー名,:パスワード,:電子メール)";
$stmt=$pdo- >prepare($sql); $username="Wid";$password="123";$email="324@QQ.com" //パラメータを定義します

$stmt->bindParam(":username ", $username,PDO::PARAM_STR);
$stmt->bindParam(":password",$password);
$stmt->bindParam(":email",$email);
$stmt->execute(); $res=$pdo->query("select * from user");
foreach ($res as $row){ // 出力結(jié)果を表示します (戻り値に従って)狀況)
// print_r($row);echo "
";
echo 'Number:'.$row['id'];echo "
";
echo 'ユーザー名:' .$row['ユーザー名'];echo "
";
echo 'パスワード:'.$row['パスワード'];echo "
";
echo 'メール:' .$row['email'];echo "
";
echo "


";
}


} catch (PDOException $e) {

echo $e->getMessage();

}

実際、これは、わずかに反復(fù)的な操作を?qū)g行するために毎回 SQL ステートメントを変更する必要を避けるためです。

もちろんプレースホルダーを変更することもできます

// $sql="insert user(username,password,email) value(?,?,?)";


// $stmt->bindParam(1,$username);
とにかく、

実際: プレースホルダーのほうがわかりやすいでしょうか?混亂するだろう。

3.4 bindingValue() はバインディングパラメータを?qū)g裝します

値をパラメータにバインドします。

/*

* バインドパラメータ

*/

header('content-type:text/html;charset=utf-8');
try {
$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');
$pdo->exec('use imooc_pdo');
$sql="ユーザー(ユーザー名,パスワード,電子メール)の値を挿入(:ユーザー名,:パスワード,:電子メール)";
// $sql="ユーザーを挿入(ユーザー名,パスワード,電子メール) 値(?,?,?)";
$stmt=$pdo->prepare($sql);

//假設(shè)電子メールパラメータ不變
$stmt-> bindValue(":email", 'shit@shit.com');
$username="Wade";$password="123";
$stmt->bindParam(":username", $username,PDO::PARAM_STR);
$stmt->bindParam(":password" ,$パスワード);
$stmt->execute();
$res=$pdo->query("select * from user");
foreach ($res as $row){ //查看輸出結(jié)果(基底回帰情況)
// print_r($row);echo "
";
echo '編號(hào):'.$row['id'];echo "
";
echo '用戶(hù)名:' .$row['ユーザー名'];echo "
";
echo '秘密:'.$row['パスワード'];echo "
";
echo '郵箱:' .$row['email'];echo "
";
echo "


";
}


} catch (PDOException $e) {
echo $e->getMessage();
}

用途は、特定の値が固定されない場(chǎng)合に、量を固定できるパラメータ値です。

3.5 bindingColumn() メソッド決定パラメータ

php オブジェクトに一列を追加します。

$pdo=new PDO('mysql:host=localhost;dbname=imooc','root','');

$pdo->exec('use imooc_pdo');

$sql="ユーザーから * を選択";
$stmt=$pdo->prepare($sql);
$stmt->execute();
//制御輸出

$stmt->bindColumn(2, $username);
$stmt->bindColumn(3,$password);
$stmt->bindColumn(4,$email);
while ($stmt->fetch(PDO::FETCH_BOUND)){
echo '用戶(hù)名:'.$username.'-密碼:'.$password.'-郵箱:'.$email.'


'; }

ここでの使用方法は、

出力結(jié)果を制御し、出力形式の制御を行うことです。

當(dāng)然のことながら、結(jié)果は底部の列に集中しており、その後の各列が何であるかを確認(rèn)できます: echo '結(jié)果集中の列數(shù):'.$stmt->columnCount().'


'; print_r($stmt->getColumnMeta(2));

3.6 fetchColumn()從結(jié)果集中取一列

前述の getColumnMeta() メソッドは、PHP のこのバージョンでは実際に実行される関數(shù)であり、將來(lái)のバージョンでは失われる可能性があります。 $stmt->execute();

print_r($stmt->fetchColumn(3));

この方法は、毎回の実行でタンパク質(zhì)痛が発生する場(chǎng)所にあるため、最初の行を指定するだけでよく、一行目であるかどうかはわかりません。 3.7 debugDumpParams()打印一條預(yù)處理語(yǔ)句

bindParam でのこの方法:

$stmt->debugDumpParams();

結(jié)果は一大堆:

SQL: [71] insert user(username,password,email) value(:username,:password,:email) Params: 3 Key: Name: [9] :username paramno=-1 name=[9] ":username " is_param=1 param_type=2 キー: 名前: [9] :password paramno=-1 name=[9] ":password" is_param=1 param_type=2 キー: 名前: [6] :email paramno=-1 name= [6] ":email" is_param=1 param_type=2 は、つまり、事前処理時(shí)に発生する可能性のある詳細(xì)な狀況です。 説明はデバッグのために作成された方法です。

3.8 nextRowset() メソッドすべての結(jié)果を取り出します

たとえば、mysql の保存プロセス (以前の mysql の博文を參照してください) に使用され、次に多數(shù)の結(jié)果の集合が取得され、その後、その集合が操作されます。

実際には、一歩下に移動(dòng)することを指します。

例私懶了,不想敲了。。。。

雖然很多,就此吧。 二日間、次の日を過(guò)ごしましたが、まだ痛みがあり、正確には生きていませんでした。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見(jiàn)つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類(lèi)リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)