PHP 不会插入 SQL Table 即使没有错误
PHP doesn't insert in SQL Table even if there aren't error
我正在处理 html 页面访问者的 ip 信息。我不想使用 GeoIp 等:我要使用 ipinfo.io 服务。在 html 页面的末尾我做了一个 get 函数,在里面我写了 ajax post。
$.get("http://ipinfo.io", function (response) {
var ip = response.ip;
var hostname = response.hostname;
var city = response.city;
var region = response.region;
var country = response.country;
var loc = response.loc;
var org = response.org;
var postal = response.postal;
var details = JSON.stringify(response, null, 4);
$.ajax({
type: "POST",
url: 'write.php',
data: '&ip=' + ip + '&hostname=' + hostname +'&city=' + city + '®ion=' + region + '&country=' + country + '&loc=' + loc + '&org=' + org + '&postal=' + postal + '&details=' + details,
success: function (data) {
alert("Sent");
},
error: function(jqXHR, text, error){
alert("Error: not sent.");
}
});
}, "jsonp");
我受到了启发:http://jsfiddle.net/zk5fn/2/
在 write.php 中,我编写了一些 fwrite 方法来写入所有获取的数据。它有效。现在,我想把这些数据 post 存入一个数据库中。我用 000webhost 使用 phpmyadmin 创建了一个。
我在 post 中没有显示任何错误,但是在我打开 phpmyadmin 的地方 table 是空的...为什么?
这是 word.php:
<?php
$link = mysql_connect("localhost", "name......", "psw....", "database-name");
if (!$link) {
alert('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
// Parse input
$ip = $_POST['ip'];
$hostname = $_POST['hostname'];
$city = $_POST['city'];
$region = $_POST['region'];
$country = $_POST['country'];
$loc = $_POST['loc'];
$org = $_POST['org'];
$postal = $_POST['postal'];
$details = $_POST['details'];
$sql="insert into `sessions` (ip, hostname, city, region,country, loc, org, postal) values('$ip','$hostname', '$city', '$region', '$country', '$loc', '$org' ,'$postal')";
$res = mysql_query($sql);
if($res){
echo "Records added successfully.";
}
mysql_close($link);
?>
更新
这是 post 的日志:
更新 2
这是我点击导出数据库时看到的SQL:
CREATE TABLE `sessions` (
`id` int(128) NOT NULL AUTO_INCREMENT,
`ip` varchar(128) COLLATE latin1_general_ci NOT NULL,
`hostname` varchar(128) COLLATE latin1_general_ci NOT NULL,
`city` varchar(128) COLLATE latin1_general_ci NOT NULL,
`region` varchar(128) COLLATE latin1_general_ci NOT NULL,
`country` varchar(128) COLLATE latin1_general_ci NOT NULL,
`loc` varchar(128) COLLATE latin1_general_ci NOT NULL,
`org` varchar(128) COLLATE latin1_general_ci NOT NULL,
`postal` varchar(128) COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
我会将 $res = mysql_query($sql);
更改为 $res = mysql_query($sql) or die(mysql_error());
以详细了解您的插入查询可能出现的错误。此外,您应该将 mysql_real_escape_string 应用于要插入数据库的任何数据。
如果调试 PHP 代码,$_POST 中有什么?试试这个:
$received = print_r($_POST, true);
$file = fopen('log.txt', 'w+');
fwrite($file, $received);
fclose($file);
在此之后,验证PHP正在接收什么,如果需要,粘贴在这里给我们可以帮助您。
我没有尝试,但我认为错误在 data: '&ip=' + ip ...
。由于这是第一个键,因此 &
是不必要的。按照我的解释尝试调试并查看它通过 ajax 发送到 PHP.
的内容
我建议以下 PHP 使用 MySQLi 准备语句:
<?php
$link = mysqli_connect("localhost", "name......", "psw....", "database-name");
$error = false;
if (mysqli_connect_errno()) {
$error = mysqli_connection_error();
echo "Connection Error: $error";
exit();
} else {
if($stmt = mysqli_prepare($link, "INSERT INTO sessions (ip, hostname, city, region, country, loc, org, postal) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")){
mysqli_stmt_bind_param(
$stmt,
"ssssssss",
$_POST['ip'],
$_POST['hostname'],
$_POST['city'],
$_POST['region'],
$_POST['country'],
$_POST['loc'],
$_POST['org'],
$_POST['postal'],
$_POST['details']
);
mysqli_stmt_execute($stmt);
echo "Records added successfully.";
mysqli_stmt_close($stmt);
}
}
mysqli_close($link);
?>
MySQL 扩展已在 PHP 5.5.0 中弃用,并在 PHP 7.0.0 中删除。
然后在您的 success
中,您可以执行以下操作:
success: function (data) {
if(data.indexOf("Error")){
console.error(data);
} else {
console.log(data);
}
}
试试这个 JS 代码:
$.get("http://ipinfo.io", function (response) {
var ip = response.ip;
var hostname = response.hostname;
var city = response.city;
var region = response.region;
var country = response.country;
var loc = response.loc;
var org = response.org;
var postal = response.postal;
var details = JSON.stringify(response, null, 4);
$.ajax({
type: "POST",
url: 'write.php',
data: 'ip=' + ip + '&hostname=' + hostname +'&city=' + city + '®ion=' + region + '&country=' + country + '&loc=' + loc + '&org=' + org + '&postal=' + postal + '&details=' + details,
success: function (data) {
console.log(data)
},
error: function(jqXHR, text, error){
console.log(text);
}
});
}, "jsonp");
还有这个 PHP 代码:
$link = mysql_connect("localhost", "name......", "psw....", "database-name");
if (!$link) {
die('Could not connect: ' . mysql_error());
}
print("This is what was received: ");
print("\r\n");
print_r($_POST);
print("\r\n");
// Parse input
$ip = $_POST['ip'];
$hostname = $_POST['hostname'];
$city = $_POST['city'];
$region = $_POST['region'];
$country = $_POST['country'];
$loc = $_POST['loc'];
$org = $_POST['org'];
$postal = $_POST['postal'];
$details = $_POST['details'];
$sql = "insert into `sessions` (ip, hostname, city, region,country, loc, org, postal) values('$ip','$hostname', '$city', '$region', '$country', '$loc', '$org' ,'$postal')";
print("This is what is sending to database: \"$sql\"");
print("\r\n");
$res = mysql_query($sql) or die(mysql_error());
if($res){
print("Records added successfully.");
}
mysql_close($link);
die();
在此之后,在 控制台 部分打开 Web 浏览器开发人员工具,看看会发生什么。
我用altervista换了主机。现在可以用了……我白白花了 1 天……该死的!所以,谁会出现这个问题,就不要选择000webhost。因为有了它你可以创建数据库,但是你不能delete/add/modify任何使用外部文件的东西。
我正在处理 html 页面访问者的 ip 信息。我不想使用 GeoIp 等:我要使用 ipinfo.io 服务。在 html 页面的末尾我做了一个 get 函数,在里面我写了 ajax post。
$.get("http://ipinfo.io", function (response) {
var ip = response.ip;
var hostname = response.hostname;
var city = response.city;
var region = response.region;
var country = response.country;
var loc = response.loc;
var org = response.org;
var postal = response.postal;
var details = JSON.stringify(response, null, 4);
$.ajax({
type: "POST",
url: 'write.php',
data: '&ip=' + ip + '&hostname=' + hostname +'&city=' + city + '®ion=' + region + '&country=' + country + '&loc=' + loc + '&org=' + org + '&postal=' + postal + '&details=' + details,
success: function (data) {
alert("Sent");
},
error: function(jqXHR, text, error){
alert("Error: not sent.");
}
});
}, "jsonp");
我受到了启发:http://jsfiddle.net/zk5fn/2/
在 write.php 中,我编写了一些 fwrite 方法来写入所有获取的数据。它有效。现在,我想把这些数据 post 存入一个数据库中。我用 000webhost 使用 phpmyadmin 创建了一个。
我在 post 中没有显示任何错误,但是在我打开 phpmyadmin 的地方 table 是空的...为什么? 这是 word.php:
<?php
$link = mysql_connect("localhost", "name......", "psw....", "database-name");
if (!$link) {
alert('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
// Parse input
$ip = $_POST['ip'];
$hostname = $_POST['hostname'];
$city = $_POST['city'];
$region = $_POST['region'];
$country = $_POST['country'];
$loc = $_POST['loc'];
$org = $_POST['org'];
$postal = $_POST['postal'];
$details = $_POST['details'];
$sql="insert into `sessions` (ip, hostname, city, region,country, loc, org, postal) values('$ip','$hostname', '$city', '$region', '$country', '$loc', '$org' ,'$postal')";
$res = mysql_query($sql);
if($res){
echo "Records added successfully.";
}
mysql_close($link);
?>
更新
这是 post 的日志:
更新 2 这是我点击导出数据库时看到的SQL:
CREATE TABLE `sessions` (
`id` int(128) NOT NULL AUTO_INCREMENT,
`ip` varchar(128) COLLATE latin1_general_ci NOT NULL,
`hostname` varchar(128) COLLATE latin1_general_ci NOT NULL,
`city` varchar(128) COLLATE latin1_general_ci NOT NULL,
`region` varchar(128) COLLATE latin1_general_ci NOT NULL,
`country` varchar(128) COLLATE latin1_general_ci NOT NULL,
`loc` varchar(128) COLLATE latin1_general_ci NOT NULL,
`org` varchar(128) COLLATE latin1_general_ci NOT NULL,
`postal` varchar(128) COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=1 ;
我会将 $res = mysql_query($sql);
更改为 $res = mysql_query($sql) or die(mysql_error());
以详细了解您的插入查询可能出现的错误。此外,您应该将 mysql_real_escape_string 应用于要插入数据库的任何数据。
如果调试 PHP 代码,$_POST 中有什么?试试这个:
$received = print_r($_POST, true);
$file = fopen('log.txt', 'w+');
fwrite($file, $received);
fclose($file);
在此之后,验证PHP正在接收什么,如果需要,粘贴在这里给我们可以帮助您。
我没有尝试,但我认为错误在 data: '&ip=' + ip ...
。由于这是第一个键,因此 &
是不必要的。按照我的解释尝试调试并查看它通过 ajax 发送到 PHP.
我建议以下 PHP 使用 MySQLi 准备语句:
<?php
$link = mysqli_connect("localhost", "name......", "psw....", "database-name");
$error = false;
if (mysqli_connect_errno()) {
$error = mysqli_connection_error();
echo "Connection Error: $error";
exit();
} else {
if($stmt = mysqli_prepare($link, "INSERT INTO sessions (ip, hostname, city, region, country, loc, org, postal) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")){
mysqli_stmt_bind_param(
$stmt,
"ssssssss",
$_POST['ip'],
$_POST['hostname'],
$_POST['city'],
$_POST['region'],
$_POST['country'],
$_POST['loc'],
$_POST['org'],
$_POST['postal'],
$_POST['details']
);
mysqli_stmt_execute($stmt);
echo "Records added successfully.";
mysqli_stmt_close($stmt);
}
}
mysqli_close($link);
?>
MySQL 扩展已在 PHP 5.5.0 中弃用,并在 PHP 7.0.0 中删除。
然后在您的 success
中,您可以执行以下操作:
success: function (data) {
if(data.indexOf("Error")){
console.error(data);
} else {
console.log(data);
}
}
试试这个 JS 代码:
$.get("http://ipinfo.io", function (response) {
var ip = response.ip;
var hostname = response.hostname;
var city = response.city;
var region = response.region;
var country = response.country;
var loc = response.loc;
var org = response.org;
var postal = response.postal;
var details = JSON.stringify(response, null, 4);
$.ajax({
type: "POST",
url: 'write.php',
data: 'ip=' + ip + '&hostname=' + hostname +'&city=' + city + '®ion=' + region + '&country=' + country + '&loc=' + loc + '&org=' + org + '&postal=' + postal + '&details=' + details,
success: function (data) {
console.log(data)
},
error: function(jqXHR, text, error){
console.log(text);
}
});
}, "jsonp");
还有这个 PHP 代码:
$link = mysql_connect("localhost", "name......", "psw....", "database-name");
if (!$link) {
die('Could not connect: ' . mysql_error());
}
print("This is what was received: ");
print("\r\n");
print_r($_POST);
print("\r\n");
// Parse input
$ip = $_POST['ip'];
$hostname = $_POST['hostname'];
$city = $_POST['city'];
$region = $_POST['region'];
$country = $_POST['country'];
$loc = $_POST['loc'];
$org = $_POST['org'];
$postal = $_POST['postal'];
$details = $_POST['details'];
$sql = "insert into `sessions` (ip, hostname, city, region,country, loc, org, postal) values('$ip','$hostname', '$city', '$region', '$country', '$loc', '$org' ,'$postal')";
print("This is what is sending to database: \"$sql\"");
print("\r\n");
$res = mysql_query($sql) or die(mysql_error());
if($res){
print("Records added successfully.");
}
mysql_close($link);
die();
在此之后,在 控制台 部分打开 Web 浏览器开发人员工具,看看会发生什么。
我用altervista换了主机。现在可以用了……我白白花了 1 天……该死的!所以,谁会出现这个问题,就不要选择000webhost。因为有了它你可以创建数据库,但是你不能delete/add/modify任何使用外部文件的东西。