2017-04-18 126 views
2

我檢查過有關錯誤的類似問題,但它們與我似乎遇到的問題不匹配。php錯誤列數與第1行的值計數不匹配?

獲取試圖將數據插入到數據庫時出現以下錯誤:

列數並不在行1的匹配值計數?

這裏是數據庫表的截圖: enter image description here

在HTML表單,與PHP文件的作用,先後與多個同名的輸入:姓名,出生日期,電子郵件,密碼,確認密碼

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-> real_escape_string($ _ POST [ '姓名,出生日期,電子郵件,密碼']',這不是 – Qirel

+0

'real_escape_string'不會將數組/逗號分隔值作爲多行的參數。 –

+0

@ Fred-ii- Could th要存儲在PHP變量中,並以相同的格式列出? – Xander

回答

2

以下部分

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

是無效的原因有兩個:

  1. mysqli::real_escape_string()只需要1參數在一個時間,一個字符串(除非使用程序,mysqli_real_escape_string(),則第一是連接,則該字符串作爲第二)
  2. $_POST無法以這種方式訪問​​,我非常懷疑你有一個字段命名爲所有。你必須指定索引,爲$_POST['name']

的解決方案是從$_POST各自的轉義值每列匹配,
像​​的名稱,
$mysqli->real_escape_string($_POST['email'])的電子郵件等上,一個例子可以分配給變量,並使用查詢中的變量,如下所示。

$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注入,而且你應該使用參數化查詢。下面給出了一個例子。

// 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}"); 
} 

當您使用當前轉義時,PHP錯誤報告的使用可能會提到有關未定義索引的內容。 總是(正在開發中)通過在文件的頂部啓用error_reporting(E_ALL); ini_set("display_errors", 1);來啓用錯誤報告,讓PHP爲您提供錯誤。

另外請注意,以純文本存儲密碼是一個大的沒有。您應該使用像password_hash()/password_verify()這樣的功能來正確安全地存儲您的用戶密碼。

參考

+0

謝謝,SQL注入現在不是問題,因爲這只是一個測試模擬。在你的解決方案中,你將如何佈置它? – Xander

+0

我建議你首先以正確的方式學習,然後使用參數化查詢。我已經編輯了我的答案,並單獨使用了'mysqli :: real_escape_string()',並添加了關於密碼安全性的說明。 – Qirel

+1

非常感謝@Qirel – Xander

相關問題