2017-04-18 97 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

相关问题