Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用从POST接收的变量向SQL表插入条目_Php_Mysql_Sql_Database_Post - Fatal编程技术网

Php 如何使用从POST接收的变量向SQL表插入条目

Php 如何使用从POST接收的变量向SQL表插入条目,php,mysql,sql,database,post,Php,Mysql,Sql,Database,Post,我试图将表单中的文本变量传递到上一页,并将其插入到SQL表中。我遇到的问题是:$sql=“插入客户(fname,lname)值($firstName,'smith')” 如果将“$firstName”替换为“John”这样的基本字符串,则名称和姓氏将按预期插入SQL表中。但是,由于我试图插入从表单收集的文本值,我需要能够使用非静态变量,但由于某种原因,我无法理解,无法工作。从我在网上读到的所有内容来看,仅仅是将变量添加到参数中应该可以使其工作,但实际上不行 我是个新手,如果我的问题让人困惑,我很

我试图将表单中的文本变量传递到上一页,并将其插入到SQL表中。我遇到的问题是:$sql=“插入客户(fname,lname)值($firstName,'smith')”

如果将“$firstName”替换为“John”这样的基本字符串,则名称和姓氏将按预期插入SQL表中。但是,由于我试图插入从表单收集的文本值,我需要能够使用非静态变量,但由于某种原因,我无法理解,无法工作。从我在网上读到的所有内容来看,仅仅是将变量添加到参数中应该可以使其工作,但实际上不行

我是个新手,如果我的问题让人困惑,我很抱歉。此外,我相当肯定,问题不在于文件上的表格上。 任何帮助都会很棒。谢谢

以下是我遇到问题的代码:

<html>
<?php

$username = $_Post['username'];
$email = $_Post['email'];
$phone = $_Post['number'];
$firstName = $_Post['firstName'];
$lastName = $_Post['lastName'];
$address = $_Post['address'];
$password = $_Post['password'];

$conn = new mysqli('localhost','root','password','database');
 if($conn->connect_error){
        echo "$conn->connect_error";
        die("Connection Failed : ". $conn->connect_error);
    } else {
        
        $sql = "INSERT INTO CUSTOMER (fname, lname) VALUES ($firstName, 'smith')";
        $conn->query($sql);
        
        echo $execval;
        echo "Registration successfully...";
        $conn->close();
    }
?>
</html>


如果要将用户输入插入数据库,则应始终使用“准备好的语句”来防止“SQL注入”或类似的情况

请点击此处:

Aashish-gaba的解决方案也应该有效,但它是不安全的

这应该适用于您的代码:

<?php

$username = $_POST['username'];
$email = $_POST['email'];
$phone = $_POST['number'];
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
$address = $_POST['address'];
$password = $_POST['password'];

$conn = new mysqli('localhost','root','password','database');
 if($conn->connect_error){
        echo "$conn->connect_error";
        die("Connection Failed : ". $conn->connect_error);
    } else {
        $stmt = $conn->prepare("INSERT INTO CUSTOMER (fname, lname) VALUES (?, ?)");
        $stmt->bind_param("ss",$fname, $lname);

        // set parameters and execute
        $fname = $firstName;
        $lname = $lastName;
        $stmt->execute();
        
        echo $execval;
        echo "Registration successfully...";
        $conn->close();
    }
?>
如果您向用户打印值,也不要忘记使用somthing来防止其他注入。比如:

echo "Registration successfully for" . htmlspecialchars($_Post['username']);

此外,将密码另存为散列(使用安全的散列函数)到数据库中。

作为一种快速修复方法,您可以如下方式更新$sql:

$firstName = $mysqli->real_escape_string($firstName);
$lastName = $mysqli->real_escape_string($lastName);

$stmt = $dbConnection->prepare("INSERT INTO CUSTOMER (fname, lname) VALUES (?, ?)");
$stmt->bind_param('ss', $param_firstName, $param_lastName);
$param_firstName = $firstName; // New line
$param_lastName = $lastName; // New line
$stmt->execute();
$sql=“插入到客户(fname,lname)值({$firstName}',{$lastName}')”

但是现在您的代码容易受到SQL注入的攻击。
至少您应该在$sql语句之前使用mysqli escape函数,如下所示:

$firstName = $mysqli->real_escape_string($firstName);
$lastName = $mysqli->real_escape_string($lastName);

$stmt = $dbConnection->prepare("INSERT INTO CUSTOMER (fname, lname) VALUES (?, ?)");
$stmt->bind_param('ss', $param_firstName, $param_lastName);
$param_firstName = $firstName; // New line
$param_lastName = $lastName; // New line
$stmt->execute();

但我强烈建议您考虑使用更高级的选项,如用于后续步骤和生产环境。

Remplace
$firstName
'$firstName'

或者使用

总结所有其他答案

首先,您应该将$firstName替换为“$firstName”,因为否则文本(例如“John”)将放置在您的查询中而不带引号,如下所示:
插入到客户(fname,lname)值(John,'smith')
这会导致错误,因为它认为John是某种变量


其次,您的代码容易受到SQL注入的攻击。这是您网站中一个非常严重的漏洞,因为攻击者可以使用它读取您的整个数据库,在这种情况下,甚至在您的数据库中创建条目,这可能导致攻击者能够通过编写文件完全接管您的网站

更多详细信息请点击此处:

重要的是,用户可以控制在
$sql=“INSERT-INTO-CUSTOMER(fname,lname)值(“$firstName”,“smith”)中使用的$firstName变量
这样,攻击者可以在该点更改查询。例如,他可以使用有效载荷
,“a”);投递台客户;——
删除客户表中的所有信息

有多种方法可以防止这种情况,但最简单的方法是使用准备好的语句。它看起来像这样:

$firstName = $mysqli->real_escape_string($firstName);
$lastName = $mysqli->real_escape_string($lastName);

$stmt = $dbConnection->prepare("INSERT INTO CUSTOMER (fname, lname) VALUES (?, ?)");
$stmt->bind_param('ss', $param_firstName, $param_lastName);
$param_firstName = $firstName; // New line
$param_lastName = $lastName; // New line
$stmt->execute();
通过这种方式,您可以确保MySQL不会将任何用户输入解释为SQL代码,而只将其解释为值

这里再次提供更深入的信息:


我尝试使用您提供的准备好的语句,但是插入到表中的每个条目只有空值。你知道是什么引起的吗?谢谢你提供的信息我不确定是否需要,但我只是在回答中更改了代码。你能试试吗?如果这仍然不起作用,您能确认$\u Post变量不是空的吗?我假设您打算在新代码的第三行键入$firstName。如果不是,则将值“firstName”传递给表。我只是尝试了一个带有一个post变量的echo语句,但什么也没有出现,所以我猜这意味着post变量有问题。感觉很糟糕,因为我已经做了几个小时了,只是没有注意到这一点。谢谢你的帮助。如果我修复了它或需要更多帮助,我会更新。我想我知道post变量有什么问题。我已经注意到您使用了
$\u Post
而不是
$\u Post
,但我认为这可能只是考虑一下您的PHP安装。现在我想这就是问题所在。尝试将post变量更改为ALL CAPS非常感谢。真不敢相信我花了几个小时在这上面。再次感谢!!!!!