我知道很多人偶尔也会遇到相同的错误,但是我已经查看了所有先前的答案和我的代码,并且尝试了使用col和不使用反引号。这是我目前尝试使用的代码$var,$var但同样
$var
if(!empty($_POST['email'])){ $date = date('dmY'); #Todays Date $ip = str_replace('.','',$_SERVER['REMOTE_ADDR']); #Visitor IP $verify = md5($date.$ip); #MD5 ENCRYPT THE 2 VALUES $fname = $_POST['fname']; $lname = $_POST['lname']; $email = $_POST['email']; $password = md5($_POST['password']); $link = mysqli_connect($dbh,$dbu, $dbp, $dbn); $query = mysqli_query($link, "INSERT INTO `users` (`email`,`fname`,`lname`,`verify`,`password`,`joined`) VALUES($email,$fname,$lname,$verify,$password,$date)"); if($query){ echo "inserted"; } else { echo mysqli_error($link); }
该表中还有其他列,但是只有上面的我想为其余部分添加数据的列可以最初使用默认值
我一直在看这段代码很久了,现在我才发现问题,我知道这很愚蠢
将变量添加到SQL查询中的最防错的方法是通过 准备好的语句 添加变量。
因此,对于您运行的每个查询,如果至少要使用一个变量,则必须用占位符代替它,然后准备查询,然后执行它,并分别传递变量。
首先,您必须更改查询,在变量中添加占位符。您的查询将变为:
$sql = "INSERT INTO users (fname, lname) VALUES (?, ?)";
然后,您将必须准备它,绑定变量并执行:
$stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "ss", $fname, $lname); mysqli_stmt_execute($stmt);
如您所见,这只是三个简单的命令:
这样,您始终可以确保添加到查询中的数据不会引起单个SQL语法错误!另外,此代码还可以防止SQL注入!
理解 仅在变量周围加上引号是不够的 ,这将非常重要,并最终会导致无数问题,从语法错误到SQL注入。另一方面,由于预准备语句的本质,它是一种防弹解决方案,无法通过数据变量引入任何问题。