2017-04-18 21 views
2

私はエラーに関して同様の質問を確認しましたが、私の持つ問題とは一致しませんでした。PHPエラー列数が行1の値数と一致しませんか?

データベースにデータを挿入しようとすると、次のエラーを取得:

列の数は、行1の値の数と一致しないのですか?ここで

データベーステーブルのスクリーンショットです:、PHPファイルのアクションで、HTMLで enter image description here

形式の名前を持つ複数の入力を持つ:名前、姓、dateOfBirthの、電子メール、パスワード、確認パスワードを

PHP:

<?php 

// Only process the form if $_POST isn't empty 
if (! empty($_POST)) { 

    // Connect to MySQL 
    $mysqli = new mysqli('localhost', 'root', '', 'pptpp'); 

    // Check our connection 
    if ($mysqli->connect_error) { 
    die('Connect Error: ' . $mysqli->connect_errno . ': ' . $mysqli->connect_error); 
    } 

    // Insert our data 
    $sql = "INSERT INTO user (Forename, Surname, DateOfBirth, Email, Password) VALUES ('{$mysqli->real_escape_string($_POST['name, surname, DateOfBirth, email, password '])}')"; 
    $insert = $mysqli->query($sql); 


    // Print response from MySQL 
    if ($insert) { 
    echo "Success! Row ID: {$mysqli->insert_id}"; 
    } else { 
    die("Error: {$mysqli->errno} : {$mysqli->error}"); 
    } 

    // Close our connection 
    $mysqli->close(); 
} 

?> 
+0

' $ mysqli->どのように動作するのですか? – Qirel

+0

'real_escape_string'は複数の行の引数として配列/カンマ区切りの値をとらない。 –

+0

@ Fred-ii- php変数に格納され、同じ形式でリストされていますか? – Xander

答えて

2

次の部分

$mysqli->real_escape_string($_POST['name, surname, DateOfBirth, email, password '] 

は、2つの理由のために無効である:

  1. mysqli::real_escape_string()は、一度に1引数、文字列(mysqli_real_escape_string()、手続きを使用していない限り、最初に接続され、第二のように文字列)かかり
  2. このようにして$_POSTにアクセスすることはできません。という1つのフィールドがすべてこの名前になっていることは間違いありません。あなたは
    電子メールの$mysqli->real_escape_string($_POST['email'])ので、など$_POST['name']

ソリューションは$_POSTからそれぞれのエスケープ値と各列を一致させることです、名前のため​​よう
として、インデックスを指定する必要があります次のように、変数を変数に割り当て、クエリの変数を使用することができます。

$name  = $mysqli->real_escape_string($_POST['name']); 
$surname = $mysqli->real_escape_string($_POST['surname']); 
$dob  = $mysqli->real_escape_string($_POST['DateOfBirth']); 
$email  = $mysqli->real_escape_string($_POST['email']); 
$password = $mysqli->real_escape_string($_POST['password']); 

$sql = "INSERT INTO user (Forename, Surname, DateOfBirth, Email, Password) VALUES ('$name', '$surname', '$dob', '$email', '$password')"; 
$insert = $mysqli->query($sql); 

次にあなたもmysqli::real_escape_string()と、それはSQLインジェクションに対して安全ではないということに注意してください、あなたはパラメータ化クエリを使用する必要があること。その一例を以下に示します。あなたは現在のエスケープを使用するときにPHPのエラー報告の

// Insert our data 
$sql = "INSERT INTO user (Forename, Surname, DateOfBirth, Email, Password) VALUES (?, ?, ?, ?, ?)"; 
if ($stmt = $mysqli->prepare($sql)) { 
    $stmt->bind_param("sssss", $_POST['name'], $_POST['surname'], $_POST['DateOfBirth'], $_POST['email'], $_POST['password']); 
    if (!$stmt->execute()) 
     die("Execution failed: ".$stmt->error); 

    echo "Success! Row ID: ".$stmt->insert_id; 
    $stmt->close(); 
} else { 
    die("Error: {$mysqli->errno} : {$mysqli->error}"); 
} 

使い方はおそらく未定義のインデックスについて何かを述べたでしょう。 常に(開発中)は、ファイルの先頭にerror_reporting(E_ALL); ini_set("display_errors", 1);というエラー報告を有効にすることで、PHPにエラーを通知します。

パスワードをプレーンテキストで保存すると、大きな数字のはありません。です。 password_hash()/password_verify()のような機能を使用して、ユーザーのパスワードを適切かつ安全に保存する必要があります。

参照($ _ POST [ '名前、姓、dateOfBirthの、電子メール、パスワード'] `それはないのですがreal_escape_string

+0

ありがとう、SQLインジェクションはこれほど問題ではありません唯一のテストのシミュレーションです。あなたのソリューションでは、どのようにレイアウトするのですか? – Xander

+0

私はあなたが正しい方法をまず何とかやって学ぶことを提案し、バットからすぐにパラメータ化されたクエリを使用します。私は 'mysqli :: real_escape_string()'を個別に使う方法を解説し、パスワードのセキュリティに関するメモを追加しました。 – Qirel

+1

ありがとう@Qirel – Xander

関連する問題