即使没有错误,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 + '®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 方法来写入所有获取的数据。它有效。现在,我想将这些数据发布到数据库中。我用 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 + '®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();
之后,打开控制台部分的网络浏览器开发工具,看看会发生什么。
【讨论】:
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: '&ip=' + ip ...
。因为这是第一个键,所以&
是不必要的。尝试按照我的解释进行调试,看看它通过 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 第一个错误显示登录失败。第二部分是您将mysql
与mysqli
混合在一起,您不能这样做。请确保您的代码以及您的 MySQL 凭据正确。【参考方案5】:
我已经用 altervista 更改了主机。现在它可以工作了....我已经花了 1 天的时间...该死的!所以,对于谁会有这个问题,只是不要选择000webhost。因为有了它你可以创建数据库,但你不能使用外部文件删除/添加/修改任何东西。
【讨论】:
以上是关于即使没有错误,PHP也不会插入SQL表[关闭]的主要内容,如果未能解决你的问题,请参考以下文章