我正在尝试使用Windows 2012 + MySQL + IIS + PHP为我的测试实验室编写程序,我的程序读取数据库,但是当我尝试将数据写入数据库时,它显示“Array([id ] => 0)“,这意味着我的程序没有将数据写入数据库,有什么问题?我是一个初学者写作课程,请帮帮我?我的代码如下:
<?php
session_start();
error_reporting(E_ALL & ~E_NOTICE);
// Connect to Database
$link = mysqli_connect("localhost", "root", "password", "admin");
// Connection Status
if ($link->connect_error) {
die ("Connection Failed : " . $link->connect_error);
}
if ($_POST['submit']) {
if (!$_POST['email'])
$error .= "<br />Bitte trage deine Email Addresse ein !";
else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
$error .= "<br />Bitte eine korrekte email Address ein !";
if (!$_POST['password'])
$error .= "<br />Bitte trage dein Passwort ein !";
else {
if (strlen($_POST['password']) < 8)
$error .= "<br />Bitte trage ein längeres Password ein !";
if (!preg_match('`[A-Z]`', $_POST['password']))
$error .= "<br />Bitte nutze ein Großbuchstaben password ein !";
}
if (isset($error))
echo "Es gab fehler in deinem Login Details : " . $error;
else {
$query = "SELECT * FROM `benutzer` WHERE email ='" . mysqli_real_escape_string($link, $_POST['email']) . "'";
$result = mysqli_query($link, $query);
$results = mysqli_num_rows($result);
if ($results) echo "Die eMailaddresse ist bereits vergeben. <br />Möchtest do dich einloggen ?";
$query = "INSERT INTO benutzer (email, password) VALUES ('" . mysqli_real_escape_string($link, $_POST['email']) . "', '" . md5(md5($_POST['email']) . $_POST['password']) . "')";
mysqli_query($link, $query);
echo "<br />Du hast dich erfolgreich registriert ! ";
$_SESSION['id'] = mysqli_insert_id($link);
print_r($_SESSION);
}
}
?>
<form method="post">
<input type="email" name="email" id="email" id="email" />
<input type="password" name="password" />
<input type="submit" name="submit" value="Einlogen" />
</form>
答案 0 :(得分:0)
您应该采取大量措施来缓解和保护数据库连接,并且应该开发当前用户名/密码的最佳做法。
MySQLi真正的转义字符串 是不够的 来保护您免受SQL注入。
MD5
是一种不适合密码的散列机制,您应该使用PHP password_hash
。使用它。
使用MySQLi_error($link)
反馈您的SQL查询有什么问题:
所以:
mysqli_query($link, $query) or die("line ".__LINE__." :".mysqli_error($link));
您可以做的一个重大改进是使用MySQLi Prepared statements(本地实际上比更受欢迎的PDO更安全,因为他们从一开始就使用fully prepared statements)
答案 1 :(得分:0)
您可以通过检查mysqli_query是否返回true来检查程序是否成功执行了INSERT qureery。
此外,mysqli_insert_id将在第一次返回0然后开始计数,尽管它可能会在某些数据库中出现问题。 你可以从mysqli_num_rows() - 1
获取id在 if($ results)
之后替换此代码if(mysqli_query($link, $query))
{
echo "<br />Du hast dich erfolgreich registriert ! ";
$query = "SELECT * FROM `benutzer`";
$result = mysqli_query($link, $query);
$results = mysqli_num_rows($result);
$_SESSION['id'] = $results-1;
print_r($_SESSION);
}
else
echo "Error inserting data!";
答案 2 :(得分:0)
例外是你的朋友,并且可以很容易地避免那种令人讨厌并且难以遵循嵌套的情况。应该很容易阅读您的脚本并遵循逻辑流程。
以下是包含感兴趣区域的异常和函数的快速示例。
function dbConnect()
{
$link = mysqli_connect("localhost", "root", "System@2012", "admin");
if($link->connect_error)
{
throw new Exception($link->connect_error);
}
}
function checkRequiredValues()
{
// initialize $error before beginning.
$error = '';
// Check email address
if (empty($_POST['email']))
{
$error .= "<br />Bitte trage deine Email Addresse ein !";
}
else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
{
$error .= "<br />Bitte eine korrekte email Address ein !";
}
// Check password.
if (empty($_POST['password']))
{
$error .= "<br />Bitte trage dein Passwort ein !";
}
else if (strlen($_POST['password']) < 8)
{
$error .= "<br />Bitte trage ein längeres Password ein !";
}
else if (!preg_match('`[A-Z]`', $_POST['password']))
{
$error .= "<br />Bitte nutze ein Großbuchstaben password ein !";
}
if (isset($error))
{
throw new Exception("Es gab fehler in deinem Login Details : " . $error);
}
}
// use !empty here to avoid a warning if post['submit'] is not set
if(!empty($_POST['submit']))
{
try
{
checkRequiredValues();
// Do this second. There is no need to establish a DB
// connection if we won't be using it.
dbConnect();
doUpdate();
}
catch(\Exception $e)
{
$e->getMessage();
}
}
我将把doUpdate函数写给你。请注意,另一张海报所说的关于使用绑定参数的内容是正确的。