MYSQL:この拡張は、PHP 5.5.0で廃止されました、そしてそれは、PHP 7.0.0で削除されました。代わりに、MySQLi
またはPDO_MySQL
拡張子を使用する必要があります。
mysqliのリファレンス:http://php.net/manual/en/mysqli.query.php
PDO参考:PDOを使用してのhttp://php.net/manual/en/book.pdo.php
利点:
ほとんどのPHPプログラマはMySQLiをとMySQLの拡張機能を使用する方法を発見しました。しかし、PHP Data Objects(PDO)は、オブジェクトを扱い、プリペアドステートメントを取得して作業をはるかに簡単にする方法を提供します。
PDOはPHPのデータベースアクセスツールで、複数のデータベース間で統一されたアクセスを可能にします。シンタックス固有のデータベースはサポートしていませんが、異なるプラットフォームやデータベース間で比較的シームレスな切り替えが可能です。接続文字列を変更するだけで簡単に行うことができます。
以下は、主にMySQLとMySQLiの拡張機能を使用しているプログラマーを対象とした、PDOに関する少しの情報で、前者の優位性を概説したものです。次のいくつかの段落で、さまざまな側面について検討します。
PDO拡張モジュールはPDOドライバがのために書かれている任意のデータベースにアクセスするための機能を備えています。 Free TDS、Sybase、Microsoft SQL Server、IBM DB2、Firebird/Interbase 6、Oracle Call InterfaceおよびPostgreSQLデータベースにアクセスするためのPDOドライバが数多くあります。
ドライバはすべてのシステムで自動的に使用できるわけではないため、使用可能なドライバを見つけて必要なものを追加する必要があります。
を接続
を扱う
- エラーは、あなたがのtry/catchブロックでPDOをラップすることをお勧めしている理由である、エラー処理のための例外を使用することができます。このようにして、例外を生成するためにPDOを関連するエラーモード属性に強制することができます。
3つのサイレント(デフォルト)警告モードと例外モードがあります。後者の2つは、DRYプログラミングでより便利です。 '警告'エラーモードはデバッグに便利です。例外モードでは、人がシステムを悪用するために使用する可能性のあるデータを隠しながら、優雅なエラー処理が可能です。
PDOは、単純な二段階プロセスに共通の挿入および更新データベース操作を凝縮:Prepare >> [Bind] >> Execute
。この方法では、PDOの準備文を最大限に活用することができます。これにより、SQLインジェクションによる悪意のある攻撃に対する保護機能が提供されます。
プリペアドステートメントは、このデータをサーバーに送信することによって複数回実行される可能性のあるプリコンプリントSQLステートメントです。プレースホルダ内で使用されるデータがSQLインジェクション攻撃から自動的に保護されるという利点があります。
したがって、PDOを使用したほうが優れており、現在のSQLインジェクションは避けられます。
PDOコード、ユーザ名とパスワードのフィールドがDBに存在するかどうかをチェックします
<?php
//Connections
try {
$handler = new PDO('mysql:host=localhost;dbname=s','root', '*');
$handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e){
exit($e->getMessage());
}
$name = $_POST['name'];
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$password1 = $_POST['passwordconf'];
$ip = $_SERVER['REMOTE_ADDR'];
//Verifcation
if (empty($name) || empty($username) || empty($email) || empty($password) || empty($password1)){
$error = "Complete all fields";
}
// Password match
if ($password != $password1){
$error = "Passwords do not match";
}
// Email validation
if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
$error = "Enter a Valid email";
}
// Password length
if (strlen($password) <= 6){
$error = "Choose a password longer then 6 character";
}
if(!isset($error)){
//no error
$sthandler = $handler->prepare("SELECT username FROM users WHERE username = :name");
$sthandler->bindParam(':name', $username);
$sthandler->execute();
if($sthandler->rowCount() > 0){
echo "User Already Exists.";
} else {
//Securly insert into database
$sql = 'INSERT INTO users (name ,username, email, password, ip) VALUES (:name,:username,:email,:password,:ip)';
$query = $handler->prepare($sql);
$query->execute(array(
':name' => $name,
':username' => $username,
':email' => $email,
':password' => $password,
':ip' => $ip
));
}
}else{
echo "error occured: ".$error;
exit();
}
希望自分で将来のプロジェクトにコードを開発するためので、この参照が役に立つかもしれません。
mysql_queryは死んでいます。PHP 7から削除されました。使用を中止し、少なくともmysqliを使用してください。 PDOはさらに優れた選択肢です。 – tadman
**警告**:独自のアクセス制御レイヤーを作成するのは簡単ではなく、間違った操作をする機会がたくさんあります。 [Laravel](http://laravel.com/)のような最新の[開発フレームワーク](http://codegeekz.com/best-php-frameworks-for-developers/)がある場合は、独自の認証システムを作成しないでください。強力な[認証システム](https://laravel.com/docs/5.2/authentication)が組み込まれています。絶対に[推奨されるセキュリティのベストプラクティス](http://www.phptherightway.com/#security)に従ってください。パスワードはプレーンテキスト**として保存しないでください。 – tadman
ユーザー名「** 'foo 'AND' 0 '=' 1' **」を使用してサインアップしてもよろしいですか?(同じユーザー名で複数回サインアップしたいと思っています) – spencer7593