不插入字符串值

c9x0cxw0  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(322)

这个问题在这里已经有答案了

在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,所以电子邮件的长度也不是问题。

jfewjypa

jfewjypa1#

为了调试它,回显或vardump发送到mysql的实际sql文本。
将代码分为两个步骤,首先构建sql字符串,然后执行sql字符串。然后在这两个步骤之间添加调试输出:

$sqltxt = "INSERT INTO ... ";

 echo "sqltext=" . $sqltext ;

 $result2=mysqli_query($db,$sqltext);

然后我们可以将实际的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

相关问题