我试图建立一个非常简单的预算"网站仅供练习,但我不能让这个网站更新我的数据库。
基本上我有一个数据库' budgetdb'使用MySQL在XAMPP中运行。我有一张表,结构如下:
我有两个文件,' index.html'和' handleUserInput.php'。
的index.html:
<!DOCTYPE html>
<html>
<body>
<input type="text" id="description">
<input type="number" id="budgetin">
<input type="number" id="budgetout">
<button type="button" onclick="updateDB()">Add to database</button>
<script>
function updateDB() {
var description = document.getElementById('description').value;
var budgetin = document.getElementById('budgetin').value;
var budgetout = document.getElementById('budgetout').value;
var xmlhttp = new XMLHttpRequest();
var url = "handleUserInput.php?description='" + description + "'&budgetin='" + budgetin + "'&budgetout='" + budgetout + "'";
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert('Variables sent to server!');
}
}
xmlhttp.open("POST", url);
xmlhttp.send();
}
</script>
</body>
</html>
handleUserInput.php:
<?php
$host = "localhost";
$username = "root";
$password = "";
$dbname = "budgetdb"
mysql_connect($host, $username, $password;
mysql_select_db($dbname);
$description = $_POST['description'];
$budgetin = $_POST['budgetin'];
$budgetout = $_POST['budgetout'];
$query = 'INSERT into budget VALUES ($description, $budgetin, $budgetout)';
mysql_query($query)
?>
显示消息提示,但数据库中未显示任何数据。我在这里做错了什么线索?
更新 Chrome错误:
Notice: Undefined index: description in /Applications/XAMPP/xamppfiles/htdocs/handleUserInput.php on line 13
Notice: Undefined index: budgetin in /Applications/XAMPP/xamppfiles/htdocs/handleUserInput.php on line 14
Notice: Undefined index: budgetout in /Applications/XAMPP/xamppfiles/htdocs/handleUserInput.php on line 15
答案 0 :(得分:1)
其他答案显示了您编写查询的方式存在的问题,它。应该是,每个值都有引号。
$query= "INSERT into budget VALUES('$description',$budgetin,$budgetout)";
但是您对创建URL的方式也有疑问。引号不应该放在查询参数旁边,您应该使用encodeURIComponent
来确保正确转义特殊字符。
var url = "handleUserInput.php?description=" + encodeURIComponent(description) + "&budgetin=" + encodeURIComponent(budgetin) + "&budgetout=" + encodeURIComponent(budgetout);
为了防止SQL注入问题,您需要在将它们用作SQL参数之前转义字符串。由于您要在网址中发送参数,而不是POST
数据中的参数,因此您需要从$_GET
而不是$_POST
获取参数。
$description = mysql_real_escape_string($_GET['description']);
虽然如果你现在第一次学习PHP,你应该使用PDO或mysqli,而不是过时的mysql扩展,并使用预准备语句而不是字符串替换。
将执行查询的行更改为:
mysql_query($query) or die(mysql_error());
如果执行查询时出现问题,则会显示错误消息。
答案 1 :(得分:0)
使用
$query = "INSERT into budget VALUES ('$description', $budgetin, $budgetout)";
description是数据库中的字符串类型,因此您可以使用PHP字符串中的单引号或双引号关闭。
始终考虑安全。将代码重写为(有点安全):
$description = mysql_real_escape_string( $_POST['description'] );
$budgetin = intval( $_POST['budgetin'] );
$budgetout = intval( $_POST['budgetout'] );
$query = 'INSERT into budget VALUES ("$description", $budgetin, $budgetout)';
注意:不要使用mysql_ *函数。它在将来的版本中已弃用。使用MySQLi或PDO
答案 2 :(得分:0)
查询中的引号不正确。应该是(注意外部双引号和内部单引号):
$query= "INSERT into budget VALUES('$description',$budgetin,$budgetout)";
但是,请注意这已经打开了SQL注入,其中描述为
'); DROP budget;
此外,您的说明可能包含标点符号和空格,这可能会弄乱您的网址。无论如何,您正在发送POST,因此所有数据都应该在请求的正文中而不是网址。
答案 3 :(得分:0)
您发送的值为 GET 参数而不是 POST 参数。
handleUserInput.php?description='" + description + "'&budgetin='" + budgetin + "'&budgetout='" + budgetout + "'"
通过url传递给PHP的所有内容都将落入$ _GET变量中。不仅PHP bu每个服务器端语言都会表现相同,一旦它是标准GET意味着URL参数和POST是Request Payload
您可以将 $ _ POST 更改为 $ _ GET 或添加数据do xmlhttprequest对象
<!DOCTYPE html>
<html>
<body>
<input type="text" id="description">
<input type="number" id="budgetin">
<input type="number" id="budgetout">
<button type="button" onclick="updateDB()">Add to database</button>
<script>
function updateDB() {
var description = document.getElementById('description').value;
var budgetin = document.getElementById('budgetin').value;
var budgetout = document.getElementById('budgetout').value;
var params = "description=" + description + "&budgetin=" + budgetin + "&budgetout=" + budgetout;
var xmlhttp = new XMLHttpRequest();
xmlhttp .setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp .setRequestHeader("Content-length", params.length);
xmlhttp .setRequestHeader("Connection", "close");
var url = "handleUserInput.php?";
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
alert('Variables sent to server!');
}
}
xmlhttp.open("POST", url,true);
xmlhttp.send(params);
}
</script>
</body>
</html>
答案 4 :(得分:-1)
为了缩小代码,请使用Jquery库而不是简单的JS代码
<html>
<head>
<script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
</head>
<body>
<input type="text" id="description">
<input type="number" id="budgetin">
<input type="number" id="budgetout">
<button type="button" onclick="updateDB()">Add to database</button>
<script>
function updateDB() {
var description = $('#description');
var budgetin = $('#budgetin');
var budgetout = $('#budgetout');
$.post( "handleUserInput.php", { "description": description, "budgetin": budgetin, "budgetout": budgetout }, function( data ) {
alert( "Variables sent to server!" );
} );
}
</script>
</body>
</html>
使用mysql_real_escape_string
以避免SQL注入您的应用程序。最初的问题是由于未在SQL查询字符串中正确添加php变量引起的,例如:
$input = 'aaa';
echo 'text $input';
此代码将输出
text $input
但是这个
$input = 'aaa';
echo "text $input";
或者这个
$input = 'aaa';
echo "text ".$input.";
将输出
text aaa
请检查以下代码
<?php
$host = "localhost";
$username = "root";
$password = "";
$dbname = "budgetdb"
mysql_connect($host, $username, $password;
mysql_select_db($dbname);
$description = $_POST['description'];
$budgetin = $_POST['budgetin'];
$budgetout = $_POST['budgetout'];
$description = mysql_real_escape_string($description);
$budgetin= mysql_real_escape_string($budgetin);
$budgetout= mysql_real_escape_string($budgetout);
$query = "INSERT into budget VALUES ('".$description."', ".$budgetin.", ".$budgetout.")";
mysql_query($query)
?>
答案 5 :(得分:-2)
使用单个反转逗号和php变量,如下所示。
$query = "INSERT into budget VALUES ('$description', $budgetin, $budgetout)";