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 +  '&region=' + 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 +  '&region=' + 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任何使用外部文件的东西。