为啥我的 INSERT INTO 方法返回 false?
Posted
技术标签:
【中文标题】为啥我的 INSERT INTO 方法返回 false?【英文标题】:why my INSERT INTO method returns false?为什么我的 INSERT INTO 方法返回 false? 【发布时间】:2015-01-09 22:44:23 【问题描述】:我正在尝试向我的一个数据库表中插入一些信息。这是我的代码:
function insertUser()
$con = db_connect();
$response = array();
if(empty($_REQUEST['firstname']))
$fnam = "";
else
$fnam = $_REQUEST['firstname'];
if(empty($_REQUEST['lastname']))
$lnam = "";
else
$lnam = $_REQUEST['lastname'];
if(empty($_REQUEST['age']))
$age = "";
else
$age = $_REQUEST['age'];
if(empty($_REQUEST['sex']))
$sex = "";
else
$sex = $_REQUEST['sex'];
if(empty($_REQUEST['location']))
$loc = "";
else
$loc = $_REQUEST['location'];
if(empty($_REQUEST['education']))
$edu = "";
else
$edu = $_REQUEST['education'];
//check if username forgot
if(empty($_REQUEST['username']))
$response[] = "Please fill username box";
else
$uname = $_REQUEST['username'];
//check if username is existed
$isExisted = mysqli_query($con, "SELECT * FROM tbl_users WHERE username = '$uname'");
if(mysqli_num_rows($isExisted) > 0)
$response[] = "Username is Existed";
//check if password forgot
if(empty($_REQUEST['password']))
$response[] = "Please fill password box";
else
$pass = $_REQUEST['password'];
if(empty($response))
//$password = getHash($password);
$res = mysqli_query($con, "INSERT INTO tbl_users (firstnam, lastname, age, sex, location, education, username, password, created_at) VALUES ('$fnam', '$lnam', '$age', '$sex', '$loc', '$edu', '$uname', '$pass', NOW())");
// user stored successfully
if ($res)
$response[] = "user stored successfully";
echo json_encode($response);
mysqli_close($con);
这是与我的数据库的连接,我可以使用它来读取数据:
function db_connect()
$con = mysqli_connect("localhost", "root", "", "ketabha");
mysqli_set_charset($con, 'utf8');
if (mysqli_connect_errno())
echo "Failed to connect to MySQL: " . mysqli_connect_error();
return $con;
表名和每个列名都是正确的,但它不起作用!当我echo json_encode($res);
它在我的浏览器中显示为假。你能帮帮我吗?
【问题讨论】:
false
表示查询出错。使用echo mysqli_error($con)
查看错误信息。
您应该使用or die(mysqli_error($con))
而不是使用echo json_encode($res);
来获得“真正的”错误。 php.net/manual/en/function.error-reporting.php 也不会受到伤害。
您应该使用bind_param()
而不是变量替换。可能其中一个变量包含引号,导致语法错误。
@Barmar 我按照你说的做了,这是我浏览器中的结果。我输入密码为 jakf\。 Erreur de syntaxe près de ''jakf\', NOW())' à la ligne 1
转义您的数据或更好的是,使用prepared statements 或PDO with prepared statements。那将解决它。幸好我懂法语,mais oui mon ami ;)
【参考方案1】:
多个cmet回答以结束问题并标记为已解决:
使用stripslashes()
和mysqli_real_escape_string()
函数转义您的数据。
更好的是,使用prepared statements 或PDO with prepared statements。
这是在一段时间内交换的许多 cmets 中的一个,例如您的 created_at
列将作为您的 NOW()
MySQL 函数的 DATETIME
。
另一个是我认为拼写错误的列名,是firstnam
,我怀疑是firstname
。
关于法语错误;这是因为 SQL 的 .ini
文件设置为 lc-messages=fr_FR
之类的东西,需要将其更改为 lc-messages=en_GB
,因为您使用的是 Wampserver,因此需要执行此操作才能获取消息英文。
Wamp 的默认语言在其 MySQL 中设置为法语,很奇怪。
您应该使用or die(mysqli_error($con))
,而不是使用echo json_encode($res);
,以获得“真正的”错误。
一旦你的代码没有错误,你就可以重新使用echo json_encode($res);
。
【讨论】:
没有这个功能我找不到问题,非常感谢你和 Barmar。 @NiloofarHakkaki 一个关于 SQL 注入的小(和幽默)指南:bobby-tables.com 我建议你阅读它以充分理解为什么 Fred 关于使用准备好的语句的建议真的是个好主意以上是关于为啥我的 INSERT INTO 方法返回 false?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 INSERT INTO VALUES 会出现“输入参数值”?
使用 insert into ... select 会导致 select 附近的语法不正确,为啥?