2016-10-05 8 views
-2

これは数多くの投稿があることを知っていますが、私はこのサイトでほぼすべての回答を試みましたが、何も動作しません。登録プロセスを実行しようとするたびに、ユーザー名が既に取得されていてもifステートメントはスキップされます。 は、ここでは、コードの一部です:ユーザ名がPHP/MYSQLですでに存在するかどうかを確認する方法

$username = $_POST['username']; 
    $password = $_POST['password']; 

    $sql = mysql_query("SELECT * FROM users (username, password) WHERE username = '".$username."'") 

if(mysql_num_rows($sql)>0) 
{ 
    echo 'taken'; 
} 

else 
{ 
... 
} 

私も、私は、彼らはmysqliのを使用していたので、彼らはこのような同じ問題を持っていたことを言って誰かが、それから離れて何もしてスレッドを見たことに注意してください。ありがとう。

+3

mysql_queryは死んでいます。PHP 7から削除されました。使用を中止し、少なくともmysqliを使用してください。 PDOはさらに優れた選択肢です。 – tadman

+3

**警告**:独自のアクセス制御レイヤーを作成するのは簡単ではなく、間違った操作をする機会がたくさんあります。 [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

+0

ユーザー名「** 'foo 'AND' 0 '=' 1' **」を使用してサインアップしてもよろしいですか?(同じユーザー名で複数回サインアップしたいと思っています) – spencer7593

答えて

1

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ドライバが数多くあります。

ドライバはすべてのシステムで自動的に使用できるわけではないため、使用可能なドライバを見つけて必要なものを追加する必要があります。

を接続

  • データベース特定のデータベースに依存してデータベース接続を確立するために、別の構文のがあります。 PDOを使用する場合は、操作がtry/catchブロックでラップされていること、例外処理のテクニックを利用していることを確認する必要があります。

    通常は、接続を1回だけ行う必要があり、接続はデータベースハンドルをnullとしてプログラミングすることで終了します。さまざまなリソースサイトで、より具体的なオプションや構文を調べることができます。 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(); 
    } 
    

    希望自分で将来のプロジェクトにコードを開発するためので、この参照が役に立つかもしれません。

+0

ありがとうございます。あなたの記事を読んだ後、私は確かにPDOに切り替えるとすぐに私は(現在000webhostを使用し、それはPHP 5.1をサポートしています)PHP 7をサポートする無料/安価なホストを見つけると思います。 –

+0

私はこの答えに私の下投票の理由を知る必要があります。正当化してください –

+0

申し訳ありませんが、私は誰があなたをdownvotedされていない... –

-6

このコードは安全ではありません。あなたは、使用前に収入データを準備する必要があります。少なくとも:

$username = addslashes(strip_tags($_POST['username'])); 
+4

いいえ、いいえ、**いいえ**。 'addslashes'は使用するツールではなく、' strip_tags'はちょっとナンセンスです。プレースホルダ値でプリペアドステートメントを使用できない場合、**ここで許容される**解決策は、mysql_real_escape_stringのようなエスケープ機能です。申し訳ありませんが非常に厳しいですが、この種の誤報に対処する必要があります。 – tadman

+4

これは恐ろしい、恐ろしい示唆です。この世界で美しくて美しいものすべてを愛するために、準備されたステートメント*を*バインド・プラチナ*で使用してください。そして、それが不可能な場合、いくつかの理由を考えれば、SQLテキストに含まれている潜在的に危険なコンテンツを適切にエスケープする必要があります*。エスケープするための "addslashes"と "strip_tags"の使用は容認できないものです。それは使えません。その目的のために明示的に意図された機能を使用してください。 'mysqli_real_escape_string'。 – spencer7593

2

これは最も洗練された解決策ではありません。しかし、ユーザー名が存在するかどうかを確認します。

if (isset($_POST["username"]) && isset($_POST["password"])) { 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 
    $stmt = $this->db->prepare('SELECT COUNT(*) FROM yourtable WHERE username=?'); 
    $stmt->bind_param("s", $username); 
    $stmt->execute(); 
    $get_instances = NULL; 
    $stmt->bind_result($get_instances); 
    $instances = NULL; 
    while ($stmt->fetch()) { 
     $instances = $get_instances; 
    } 
    $stmt->close(); 

    if ($instances == 0) { 
     //whatever you want to happen   
    } 
} 
+0

このチュートリアルは、上のコードを文脈に置くのに役立ちます:https://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app –

+0

これは私のためのいくつかのマイナーチェンジに感謝しました。私は、新しいPHPバージョンのサーバーを持っていて、その後はPDO拡張におそらく切り替えるより良いホスティングを見つけるまで、この方法を使用します。 –