我正在尝试使用PHP和PHPMyAdmin为网站创建注册页面。 我已经在注册所需的表格中设置了2个字段:电子邮件和密码,密码确认。
它们都被视为PHP中的字符串和数据库中的varchar。我不知道为什么,但每次用户插入电子邮件和密码并确认时,新用户都被插入数据库中,但是电子邮件和密码为0,它们确实具有真正的价值。我确定PHP变量中的电子邮件和密码值是正确的,因为我打印到mysqli查询之前立即输出它们的内容,所以我假设这是一个数据库问题。
我目前正在使用Wamp Server for Windows 8和PHPMyAdmin 4.1.14。数据库的类型为InnoDB,并带有latin_swedish_ci字符。 PHP中使用的查询是:
"INSERT INTO users (email,password) VALUES (email = '$email', password = '$password')"
使用mysqli_query执行。
答案 0 :(得分:7)
不要执行column equals variable
,而是执行:
VALUES ('$email','$password')
如果INSERT
确实是您想要使用的。
语法VALUES (email = '$email', password = '$password')
适用于在使用WHERE
子句时检查列是否等于某事的情况。
WHERE email = '$email'
或
WHERE email = '$email' AND password = '$password'
做UPDATE
时的另一个例子:
UPDATE table_name SET email = '$email', password = '$password'
WHERE column_x='something'
或者,当做SELECT
作为另一个例子时:
SELECT * FROM table_name
WHERE column_x = 'something' OR column_y = 'something else'
OR
可以替换为AND
,具体取决于所需的查询。然而,当您修复它时,该方法对SQL injection开放。使用prepared statements或PDO with prepared statements,它们更安全。
防止SQL注入的基本示例是:
$email = mysqli_real_escape_string($con, $_POST['email']);
$password = mysqli_real_escape_string($con, $_POST['password']);
检查旁注错误:
将error reporting添加到文件的顶部,这将有助于在生产测试期间。
error_reporting(E_ALL);
ini_set('display_errors', 1);
用数据库连接变量替换or die(mysqli_error($con))
时和mysqli_query()
到$con
。
答案 1 :(得分:2)
Matteo - 另外,您应该考虑参数化您的php语法以防止SQL注入。现在最好这样做,而不是以后再回来。你可以在这里找到概念的解释; https://stackoverflow.com/questions/25316766/understanding-parameterized-queries-and-their-usage-in-preventing-sql-injections
答案 2 :(得分:0)
INSERT INTO users (email,password) VALUES ('$email', '$password')
在VALUES之后你不需要列名。您已经在表名后指定了它。
顺便说一下,你可能想看看php prepared statement