2016-10-25 7 views
0

を得たので、これは私のコードの一部しか関連のものだけです:
SQLインジェクション:それを避けるためにしようとしたが、エラー

if ($check == 0) {  
        $host = "localhost"; 
        $user = "root"; 
        $pass = ""; 
        $db = "myfirstdb"; 
        $connect = new mysqli($host,$user,$pass,$db); 
        if ($connect->connect_error){ 
         die("Connection failed: " . $connect->connect_error); 
        } else { 
         echo "Connected successfully!"; 
        } 

        //$sql = "INSERT INTO table1 (firstname , lastname , phone , email , date) VALUES (:fname, :lname, :phone, :email, :date)"; 
        $secure = $db->prepare("INSERT INTO table1 (firstname , lastname , phone , email , date) VALUES (:fname, :lname, :phone, :email, :date)"); 
        $secure->bindParam(':fname' , $firstname); 
        $secure->bindParam(':lname' , $lastname); 
        $secure->bindParam(':phone' , $phone); 
        $secure->bindParam(':email' , $email); 
        $secure->bindParam(':date' , $date); 
        $secure->execute(); 
        /*if ($connect->query($sql) === TRUE) { 
         echo "New record created successfully"; 
        } else { 
         echo "Error: " . $sql . "<br>" . $connect->error; 
        }*/ 

        $connect->close(); 

私はコードのエラーポップを実行するたびに、私が持っている問題がありますアウト:

Fatal error: Uncaught Error: Call to a member function prepare() on string in C:\xampp\htdocs\example\Index.php:206 Stack trace: #0 {main} thrown in C:\xampp\htdocs\example\Index.php on line 206

私はこのコードを使用して、SQLインジェクションを防ぐためにしようとしているが、私はそれを理解しているかどうかわかりません。

+1

準備ができませんでした。エラーの確認に失敗し、エラーをそれ以降に伝播しました。具体的には、mysqliは名前付きプレースホルダをサポートしていません。まったく異なるライブラリでPDOセマンティクスを使用しようとしています。 **決して**外部リソースの操作で成功した**と仮定します。常に失敗と見なし、失敗をチェックし、成功を快活な驚きとして扱います。 –

+1

あなたは$ db変数を持っていません。あなたは$ connectを持っています。 –

+0

また、渡している変数がどこに設定されているのかわかりません。 – xQbert

答えて

2

正しい変数でステートメントを準備していません。あなたが実行する必要があります。

$connect->prepare("INSERT INTO table1 (firstname , lastname , phone , email , date) VALUES (:fname, :lname, :phone, :email, :date)"); 

EDIT:あなたのオブジェクトがある$connectあり、この場合のように、

$db = "myfirstdb"; 
    $connect = new mysqli($host,$user,$pass,$db); 

あなたオブジェクトは、あなたが「新しいクラス」として設定vaiableです新規mysqliクラスインスタンス。元のスクリプト(エラーが発生した)は、変数の文字列を使用していました。

オブジェクトには、->prepare->の構文を使用)しか使用できません。

1

useyourillusiontoo's答えに加えて、コメントにマークBが指摘したように、表示するコードはMySQLiPDOの間で混同されています。

さまざまな違いがあります。基本的には、六角形の穴に六角形を合わせようとしています。 MySQLiは?をプレースホルダとして使用し、PDOはあなたのスクリプトと同じ名前のプレースホルダを使用します。

たとえば、あなたのコードは次のとおりです。これはあなたがmysqli DBハンドラを使用しているので、あなたは?とあなたの:placeholderを交換する必要があり、その後、彼らが表示される順序で変数を設定

$connect = new mysqli($host,$user,$pass,$db); 

意味ようなSQLストリング

$secure = $connect->prepare("INSERT INTO table1 
        (firstname , lastname , phone , email , date) 
        VALUES (?, ?, ?, ?, ?)"); 
    $secure->bind_param('sssss' , 
         $firstname, $lastname , $phone, $email ,$date); 

そこで最初?可変型宣言の後の最初の変数(SESの01のセットを取り)、この場合、最初に?$firstnameを指します。 ?の数とバインドパラメータに指定されている変数の数はに一致する必要があります。

Note the class method is ->bind_param for MySQLi rather than ->bindParam .

あなたはMySQLiPDOの一般的な構文の違いに特にbind_param手段にthe first paramterものについてread up a bitにする必要があります。

として、あなたのクラスを設定しますあなたのスクリプトでPDOを使用するには:私はあなたがMySQLiをを使用することができれば、これはあなたがまた、PDOを実行することができますない guarenteeを行うこと資格う

$connect = new PDO(...$details...); 

。彼らは違う。スクリプト内の正しいPDO設定の詳細については、hereを参照してください。

関連する問題