我对PHP和编码非常陌生,我正在努力学习 - 但我被困住了,希望有人可以指出错误的原因 -
我的代码显示文字"失败"一打开我的页面。我的目标是让"失败"仅在用户输入信息时显示,并且无法连接到数据库。
我正在使用WAMP,我的数据库服务器在MySQL中。另外,当我点击"注册"我没有在我的数据库中获得任何结果 - 并且没有错误消息来指示原因。
<?php
require('connect.php');
$username = @$_POST['username'];
$password = @$_POST['password'];
$repass = @$_POST['repassword'];
$Email = @$_POST['email'];
if(isset($_POST['submit']))
{
if($query = mysqli_query("INSERT INTO users (`id`, `username`, `password`, `email`) VALUES ('', '".$username."', '".$password."', '".$Email."')"))
echo "Success";
}else{
echo "Failure";
}
?>
<?php
$connect = mysqli_connect("localhost", "root", "") or die("Couldn't connect to server");
mysqli_select_db($connect, "php_forum") or die("Couldn't connect to database");
?>
请帮忙!如果我没有解释发生的事情,请告诉我
答案 0 :(得分:1)
回答您的具体问题:
你看到的原因&#34;失败&#34;访问该页面是这样的:
echo "Failure";
当isset($_POST['submit'])
为false时运行。
您可以更新您的代码,使其更接近,但仍然需要处理其他与注册相关的问题。
if (isset($_POST['submit'])) {
if ($query = mysqli_query("INSERT INTO users (`id`, `username`, `password`, `email`) VALUES ('', '" . $username . "', '" . $password . "', '" . $Email . "')")) {
echo "Success";
} else {
echo "Failure";
}
}
答案 1 :(得分:0)
@
。 &符号抑制错误消息。使用它999/1000次是一个坏主意。 ?>
,除非您在此之后实际发布非PHP数据(例如HTML)password_hash
存储密码的哈希值。 从不在您的数据库中存储明文密码。永远。不,甚至没有测试。 (Ok, How do I do this?)Prepared Statements
保护自己免受SQL Injection attacks和最佳实践的影响。
(How?)Prepared Statements
,这只能是可接受的(但仍然不是明智的)。 始终检查任何HTML <form>
中提供的数据是否有效(Rough guide to Prepard Statements)。 die()
语句)。 POST
数据而不是GET
数据。 (关于Stack Overflow的问题很多关于此竞技场中的可能错误)。 AUTO_INCREMENT
MySQL列值(id
)可以在PHP SQL代码中被忽略,它们将由MySQL自己插入。 你的代码很糟糕,但没关系。您需要的是一致。即使是一贯可怕的,也比抽象的可怕更好。
您需要始终如一地形成if
语句。有时它们有括号{...}
,有时它们没有。isset
。这使得正确读取代码变得更加困难。
我个人认为<?php
require('connect.php');
$username = $_POST['username'];
$password = $_POST['password'];
$repass = $_POST['repassword'];
$Email = $_POST['email'];
if($_POST['CSRF_token'] == $_SESSION['token_value'])
{
/***
* Check Password values are equal.
***/
if($password == $repass){
$pwd = password_hash($password,PASSWORD_DEFAULT);
}
else {
echo "passwords do not match! Nothing saved!";
die();
}
/***
* Likewise you can also check the Emal is a valid format, etc. etc.
***/
/***
* Try and insert using procedural MySQLi.
* Note if statement brackets.
***/
if($query = mysqli_query("INSERT INTO users ( `username`, `password`, `email`) VALUES ( '".$username."', '".$pwd."', '".$Email."')")){
echo "Success"; //only echoed if the INSERT succeeds
}
else{
/***
* Only echoed if the insert failed
* AND the form WAS submitted.
***/
echo "Failure";
}
} // close your outer if block.
是一个可怕的功能。
我也认为你应养成使用(和检查)CSRF token的习惯。
请原谅我没有花费大量时间和精力将准备好的语句应用于此代码块。它会模糊OP的预期变化,因为它们不能很好地用于准备语句
function drawChart () {
$.ajax({
url: 'Temp.ESP',
type: 'get',
success: function (txt) {
var dataArray = [['Name', 'Date']];
var txtArray = txt.split('\n');
for (var i = 0; i < txtArray.length; i++) {
var tmpData = txtArray[i].split(/\s+/);
dataArray.push([tmpData[0], parseInt(tmpData[1])]);
}
var data = google.visualization.arrayToDataTable(dataArray);
var chart = new google.visualization.LineChart(document.querySelector('#chart_div'));
var options = {width: '100%',
height: '40%',
legend: 'none',
colors: ['red'],
hAxis: {
textStyle:{color: 'white'}},
vAxis: {
textStyle:{color: 'white'}},
backgroundColor: { fill:'transparent' }};
chart.draw(data,options); //forgot this call
$(window).resize(function(){
chart.draw(data,options);
});
}
});
答案 2 :(得分:-1)
您的连接缺少参数,应该是
$connect = mysqli_connect("HostName","UserName","password","DBName") or die("Some error occurred during connection " . mysqli_error($con));
这将包括错误检查。
为什么你的变量前面有@符号和查询语句中所有变量之前的句号(可能是个愚蠢的问题,如果对不起)?