这个问题在这里已经有答案了:
在mysql中何时使用单引号、双引号和反引号(13个答案)
如何显示mysqli查询的错误[重复](2个答案)
两年前关门了。
下面是我的代码片段
if(isset($_POST['register'])){
include("../includes/config.php");
$otp = $_POST['otp'];
$sentotp = $_SESSION['otp'];
if(empty($_POST['otp'])){
$error= '<b>OTP cannot be empty.</b>';
}
if($otp==$sentotp){
$fname=$_SESSION['fname'];
$lname=$_SESSION['lname'];
$email=$_SESSION['email'];
$pwd=$_SESSION['password'];
$phno=$_SESSION['phno'];
$result2=mysqli_query($db,"INSERT INTO `user`(`fname`, `lname`,`password`, `phno`,`email`) VALUES ($fname,$lname,$pwd,$phno,$email);");
unset($_SESSION['fname']);
unset($_SESSION['lname']);
unset($_SESSION['email']);
unset($_SESSION['password']);
unset($_SESSION['phno']);
//header('Location: ../src/index.php');
}
}
如我们所见, fname,lname,password
以及 email
是字符串数据类型。但由于某种原因 email
无法插入我的数据库。我已尝试使用以下查询进行调试
$result2=mysqli_query($db,"INSERT INTO `user`(`fname`, `lname`,`password`, `phno`) VALUES ($fname,$lname,$pwd,$phno);");
在本例中,将执行查询。在有人提议之前 $_SESSION['email']
可能是空的,我想澄清它不是。我已经回应了 $_SESSION['email']
它正在返回一个完美的字符串。另外,我还设置了 email
字段设置为100,所以电子邮件的长度也不是问题。
1条答案
按热度按时间jfewjypa1#
为了调试它,回显或vardump发送到mysql的实际sql文本。
将代码分为两个步骤,首先构建sql字符串,然后执行sql字符串。然后在这两个步骤之间添加调试输出:
然后我们可以将实际的sql文本带到另一个客户机,并在那里使用它。我们会发现一个问题。。。字符串文本需要用单引号括起来。
此外,还有
mysqli_error
函数将在检测到错误后检索mysql错误消息。在这种情况下,如果发生错误,mysqli\u查询将返回false。这段代码实际上可以检查mysqli\u查询返回的值,并确定语句执行是否成功,而不是把它的小指放到嘴角,邪恶博士风格的“我只是假设一切都会按计划进行。什么?”最后,代码中的模式似乎容易受到sql注入的攻击。
合并到sql文本中的值必须正确转义。
这个
mysqli_real_escape_string
函数是定制编写的,可以做到这一点。这就是它的设计目的。http://php.net/manual/en/mysqli.real-escape-string.php
更好的模式是使用带绑定占位符的准备语句
https://www.owasp.org/index.php/sql_injection_prevention_cheat_sheet