【问题标题】:Issues with MySQL Queries on certain hosting packages某些主机包上的 MySQL 查询问题
【发布时间】:2011-04-08 18:58:54
【问题描述】:

我一直在我的公司托管包的子域上建立一个网站。它在后台发生了 PHP MySQL 操作,即 INSERTs、SELECTs 等。

它们是最基本的基本 SQL 语句,它们都可以正常工作。

但是,我最近从我的子域中复制了所有内容并将其全部上传到我的客户自己的由 1&1 运行的托管包,现在,我的 INSERT 语句不起作用。 SELECT、DELETE 语句都可以正常工作,但我的 INSERTS 不行。

我认为这是两个问题之一,要么是新数据库的权限错误,要么是我的代码中有一些明显的错误,而我的上一个数据库似乎并不在意。

这是我的插入代码:

<?php
include 'data.php';

$b_name = mysql_real_escape_string($_POST['businessName']);
$b_town = mysql_real_escape_string($_POST['placeName']);
$b_code = mysql_real_escape_string($_POST['postCode']);
$latlng = mysql_real_escape_string($_POST['latLong']);

mysql_connect($host, $user, $pass) or die ("Wrong Information");

mysql_select_db($db) or die("Wrong Database");

$newloc = preg_replace("/^.*\(([^)]*)\).*$/", '$1', $latlng);

$result = mysql_query("INSERT INTO reseller_addresses VALUES (NULL ,  '$b_name',  '$b_code',  '$b_town',  '$newloc');") or die ("Broken Query");

echo "<script>setTimeout(\"self.parent.location.reload(true);\", 1000);</script><font color=\"#fbf7d7\">$businessName Successfully Added to the Database</font>";

mysql_close();
?>

这是关于从谷歌地图/表单设置中将地理位置添加到数据库中。

很遗憾,我无法授权实时预览,因为发生问题的管理区域是安全的。

提前感谢您的帮助。

编辑:我已经在我的网络服务器和我的客户端之间来回传递相同的文件,它们都适用于我,但不适用于我的客户端。

编辑:对不起,我在这里解释得很糟糕。基本上,一条新记录被插入到数据库中,但它是空的。

一个 print_r($_POST);揭示:

Array ( [businessName] => test [placeName] => test [postCode] => test [latLong] => (51.152495, -1.440411) [Submit] => Submit Place )

这是我提交的所有内容

【问题讨论】:

  • 什么不起作用?您收到了哪些错误消息?
  • 听起来您在客户端主机上的 db 用户只能访问“读取”操作。但是你应该从 MySQL 得到一个明确的错误。
  • 看起来像是权限/配置问题,除了 INSERT 之外您可以执行任何操作。
  • 代替或死亡(“Broken Query”);尝试做或死(mysql_error());看看会发生什么,应该有一些关于这个问题的信息。
  • 我编辑了我的 OP,我意识到我对问题的解释有多么糟糕。插入了一条记录,但它是空白的。所以我猜这一定是 $_POST 的问题?

标签: php mysql html hosting


【解决方案1】:

请替换上面写着的那一行

$result = mysql_query("INSERT INTO ...") or die ("Broken Query");

以下内容:

$query = "INSERT INTO ...";
echo $query;
$result = mysql_query($query) or die (mysql_error());
$warnings = mysql_query("SHOW WARNINGS");
if ( mysql_num_rows($warnings) ) {
    while ( $row = mysql_fetch_assoc($warnings) ) {
        echo "\nMySQL Warning: ".$row['Message'];
    }
} else {
    echo "\nNo warnings";
}

并告诉我们输出是什么。

另外,请在include 'data.php'; 之后立即添加error_reporting(E_ALL &amp; ~E_STRICT);,看看是否收到任何错误消息。

也请给我们SHOW CREATE TABLE reseller_addresses的输出。

【讨论】:

  • 感谢您的回答,但自从我写了这个问题后,我发现问题不在于我的查询,而在于我的 mysql_real_escape_string。删除它可以使查询正常工作,但是另一方面,如果没有这个,我将如何防止攻击?
  • 您确定问题出在mysql_real_escape_string() 上吗?执行以下操作:$b_name = mysql_real_escape_string($_POST['businessName']); echo "Before: ".$_POST['businessName']."\nAfter: ".$b_name; 并告诉我们输出的内容。
  • 绝对是mysql_real_escape_string()。奇怪的是,我在我的很多网站上都使用这个代码作为股票,但我从来没有遇到过这个问题。上帝我讨厌 1&1
  • 我没有使用mysql_ 函数的经验,因为我只使用过mysqli_。我只能建议更改为mysqli_ 并查看是否可以解决问题。 (其他人可能会建议改用 PDO,这也很好,但重构工作可能比仅仅更改为 mysqli 多得多,具体取决于代码库的大小和复杂性。)
【解决方案2】:

我做了一系列测试,问题在于 mysql_real_escape_string 行。我删除了它并且它起作用了。但是我仍然需要一些注入保护,所以我添加了 addlashes。

我不知道为什么会这样,我希望我的修复不是暂时的。

【讨论】:

    猜你喜欢
    • 2013-03-09
    • 2011-06-05
    • 2013-08-19
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多