即使没有错误,PHP也不会插入SQL表[关闭]

Posted

技术标签:

【中文标题】即使没有错误,PHP也不会插入SQL表[关闭]【英文标题】:PHP doesn't insert in SQL Table even if there aren't error [closed] 【发布时间】:2016-05-24 05:11:02 【问题描述】:

我正在处理访问 html 页面的用户的 ip 信息。我不想使用 GeoIp 等:我将使用 ipinfo.io 服务。在 html 页面的末尾,我做了一个 get 函数,在里面我写了 ajax 帖子。

$.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 方法来写入所有获取的数据。它有效。现在,我想将这些数据发布到数据库中。我用 phpmyadmin 和 000webhost 创建了一个。

我在帖子中没有显示任何错误,但是在我打开 phpmyadmin 的地方,表是空的……为什么? 这是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);
?> 

更新 这是帖子的日志:

更新 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 ;

【问题讨论】:

它实际上是否回显“记录添加成功。”到屏幕上? 添加“或死(mysqli_error());”在查询结束时查看错误原因 这段代码不安全,容易受到sql注入攻击 在定义 $sql 后回显它以查看查询中是否存在这些值。我从未见过以这种方式传递的 POST 数据;那可能吗?我通常使用对象 ip:ipVar, host:hostVar。还要研究清理或准备语句以防止 sql 注入。 mysql_connect("localhost", "name......", "psw....", "database-name") 没有做你应该做的希望/希望 【参考方案1】:

我会将$res = mysql_query($sql); 更改为$res = mysql_query($sql) or die(mysql_error()); 以了解有关插入查询可能出现的错误的更多信息。此外,您应该将 mysql_real_escape_string 应用于您插入数据库的任何数据。

【讨论】:

它没有显示任何错误:/ 无论如何,我应该像这样定义变量: $hostname = mysql_real_escape_string($_POST['hostname']); ? 我会仔细检查数据库界面中的字段名称(例如 phpMyAdmin),以确保您在 php 代码中正确引用了它们。另外,是的,这是转义帖子变量的正确方法。 如果你看到我的回答,我已经用代码 sql 代码更新了【参考方案2】:

试试这个 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();

之后,打开控制台部分的网络浏览器开发工具,看看会发生什么。

【讨论】:

postimg.org/image/483gnyazx 叮!阅读第二行:Access denied for user ... 这是错误。 是的,我读过它,但是 lol 凭证是正确的.....登录数据库的用户是 a6033757_admin,我在 mysql_connect 中写了它......也许我必须添加@localhost? 有两种可能:1)密码错误或2)用户没有权限访问mysql服务器/数据库。 你是对的,我已经改变了主机(altervista),现在它可以工作了......!!!非常感谢您的帮助【参考方案3】:

如果你调试 PHP 代码,$_POST 中有什么?试试这个:

$received = print_r($_POST, true);
$file = fopen('log.txt', 'w+');
fwrite($file, $received);
fclose($file);

在此之后,验证 PHP 正在接收什么,如果需要,粘贴到这里给我们可以帮助你。

我没有尝试,但我认为错误出现在 data: '&amp;ip=' + ip ...。因为这是第一个键,所以&amp; 是不必要的。尝试按照我的解释进行调试,看看它通过 ajax 发送到 PHP 的内容。

【讨论】:

添加你的代码,我在firefox的控制台没有错误,但是我看不到任何新的log.txt文件!! 好的,这是因为 PHP 正在接收 $_POST 并将其内容写入文件。如果存在 log.txt 文件,请检查 write.php 的相同路径,打开它并查看写入的内容。 是的,我看过了,但是那个文件不存在! 好的,我会尽快发布另一个答案给您尝试。 谢谢,我也在尝试解决【参考方案4】:

我建议使用 MySQLi Prepared Statement 的以下 PHP:

<?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);
  

【讨论】:

mmmm.... 我已经用你修改了我的代码,这是 html 文件中的控制台结果:postimg.org/image/tazhlcqid @panagulis72 第一个错误显示登录失败。第二部分是您将mysqlmysqli 混合在一起,您不能这样做。请确保您的代码以及您的 MySQL 凭据正确。【参考方案5】:

我已经用 altervista 更改了主机。现在它可以工作了....我已经花了 1 天的时间...该死的!所以,对于谁会有这个问题,只是不要选择000webhost。因为有了它你可以创建数据库,但你不能使用外部文件删除/添加/修改任何东西。

【讨论】:

以上是关于即使没有错误,PHP也不会插入SQL表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使使用提交后 sql plus 也不会保存新行?

数据未使用 php 插入 sqlite3 数据库

SQL插入非常慢[关闭]

即使使用事务回滚,SQL标识(自动编号)也会增加

使用jquery sql插入多行并且php不起作用

试图在php MYSQL中将数据从一个表插入另一个表[关闭]