2017-12-07 10 views
0

私はphpを初めて使用しており、これをデバッグする方法がわかりません。php内でjsonを解釈してmysqlに渡す際に問題が発生しました

jsonをPHPページに渡してから、そのデータをmySQLに送信しようとしています。

私は、PHPファイル内のデータを解釈したり、PHPページに情報を渡したりする際に問題があると思います。 phpファイルを開くと、データベースに適切にアクセスしていることを示します。ここで

は私のjavascriptのコードです:

var request = new XMLHttpRequest(); 
        request.open('POST', 'http://website/saveF.php', true); 
        request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); 
        request.send(bInfo); 

これは、情報を取得し、その後、MySQLデータベースに追加するPHPファイルにそれを渡しています。

は、ここに私のPHPコードです:

これはJSONをデコードして、配列内の各エントリの上にitteratingされます。次に、Webサイトがリストされているかどうかを質問し、適切なテーブルに格納します。サニタイズは、配列要素のいずれかに失敗した場合

$input = filter_var($postThings, FILTER_SANITIZE_STRING); 

falseを返します:

//as long as the connection is good then we keep it live. 
include_once "head.php"; 

if ($conn->connect_error) { 
    die("connection failed: " . $conn->connect_error); 
} 

//gettting the information from the front end (index.html) 
$inputJSON = file_get_contents('php://input'); 
//decode all the previously encoded information 
$postThings = json_decode($inputJSON, TRUE); 
$input = filter_var($postThings, FILTER_SANITIZE_STRING); 

//create a variable the is the total length of our array 
$totalNum = count($input); 
//arrays start at 0 
$i = 0; 
//you can see where this is going. We have a while loop that will continue as long as i is less than totalnum. Ask me why i didn't use a for loop.... I don't have an answer. 

    while($i < $totalNum){ 
     $var0 = $input[$i][0]; 
     $var1 = $input[$i][1]; 
     $var2 = $input[$i][2]; 
     $var3 = $input[$i][3]; 
     $var4 = $input[$i][4]; 
     $var5 = $input[$i][5]; 
     $var6 = $input[$i][6]; 

     if($var1 == "Not Listed") { 
      $sql = "INSERT INTO missing(cName, website, rating, phone, id, address, placeType) VALUES ('$var0', '$var1', '$var2', '$var3', '$var4', '$var5', '$var6')"; 
     }else{ 

      //here we set the information into the database. 
      $sql = "INSERT INTO companies(cName, website, rating, phone, id, address, placeType) VALUES ('$var0', '$var1', '$var2', '$var3', '$var4', '$var5', '$var6')"; 
    } 


     if ($conn->query($sql) === TRUE) { 
      echo "New record created successfully"; 
     } else { 
      echo "Error: " . $sql . "<br>" . $conn->error; 
     } 

     $i++; 
    } 
+1

なぜ '$ _POST'配列を使用しないのですか? – Luca

+2

あなたのコードは[** SQLインジェクション**](https://en.wikipedia.org/wiki/SQL_injection)攻撃に対して脆弱です。あなたは[** mysqli **](https://secure.php.net/manual/en/mysqli.prepare.php)または[** PDO **](https ://secure.php.net/manual/en/pdo.prepared-statements.php)ドライバ。 [**この記事**](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)には、いくつかの良い例があります。 –

+0

@ルーカ私がどこから学んだのか分からないので、私は$ _POST配列を使いませんでした。今のところtphp:// inputが動作しているはずです。 – krizpers

答えて

0

まず、この行があることに注意してください。あなたのコードでは、サニタイズ直後に($ input)をテストする必要があります。

さらに、SQLインジェクションとXSS攻撃を避けるために、入力をさらにサニタイズする必要があります。 (例えば、エスケープ文字やその他の注射可能な文字を削除する)。

http://php.net/manual/en/mysqli.real-escape-string.php

最後に、あなたがSQLインジェクション攻撃を避けるためにバインドされたパラメータまたは完全に消毒入力を使用することをお勧めします。

+0

これは問題でした!どのように私はそれがfalseを返すことなく配列を消毒することができますか? – krizpers

+0

私は通常、preg_replaceと厳密なパターンを自分で使います。通常、私はa-zA-Z0-9以外の文字を文字(空) ''''で置き換えます。予想される形式に依存します。衛生面ではより厳しいほど良い。 –