2

是的,我知道,这是常见的问题,但我无法在过去 3 小时内解决它。

我做这个查询:

$query = 'UPDATE `'.$masterapp_users_table.'` SET `login` = "'.htmlspecialchars(strip_tags($_POST['login'])).'", `pass` = "'.md5(htmlspecialchars(strip_tags($_POST['pass']))).'", `email` = "'.htmlspecialchars(strip_tags($_POST['email'])).'", `firstname` = "'.htmlspecialchars(strip_tags($_POST['fn'])).'", `secondname` = "'.htmlspecialchars(strip_tags($_POST['sn'])).'" WHERE `login` = "'.htmlspecialchars(strip_tags($_POST['previouslogin'])).'"';
            echo $query.'<br />';
            mysql_query($query) or die(mysql_error());

我明白了:

UPDATE `masterapp_users` SET `login` = "asdasdasd", `pass` = "a3dcb4d229de6fde0db5686dee47145d", `email` = "asdasdasd", `firstname`
= "asdasdasd", `secondname` = "asdasdasd" WHERE `login` = "88888881"<br />Unknown column 'login' in 'where clause'

但它改变了记录!也许有人可以看到我看不到的东西?

哦!忘了说:如果我将该字符串从浏览器粘贴到 PMA,它工作正常。

更新:

CREATE TABLE IF NOT EXISTS `masterapp_users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `login` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `pass` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `email` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `firstname` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `secondname` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `login` (`login`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=33 ;
4

2 回答 2

5

该错误表示MasterApp_Users未调用表中的列login;它是Loginor LOGINor log_inor or or useror usernameor user_nameor ...

在构造字符串的语句中,您有反引号:

 UPDATE `'.$masterapp_users_table.'` SET `login` ...

在 中echo,那些反引号没有显示。

如果您使用这样的反引号,则列名将区分大小写。CREATE TABLE 语句的拼写究竟是什么?列名是否在反引号内以混合大小写写成?


...现在我们显示了表模式,它不太可解释(之前不是很容易解释)...

你确定你的浏览器和你的 PHP 连接到同一个数据库吗?

为了进一步调试,我建议更改:

  • 用于指定id列和适当值的 WHERE 条件。
  • 不要设置login列。

检查 UPDATE 是否更改了您期望它更改的内容。

如果它没有更改您认为应该更改的记录(但它确实有效),那么您在识别数据库时遇到了问题。

如果您最终没有找到不同的列,我们可以很确定完全不同的表。也许做一个SELECT * FROM masterapp_users并查看返回的列定义。

如果它改变了记录,那么我们手上就有一个很深的谜团。


它改变了记录。

投诉专门针对loginWHERE 子句中的列。如果id在 WHERE 子句中指定,是否可以login在语句的 SET 子句中设置?

如果是这样,这开始看起来像 DBMS 中的错误。很难理解为什么它会login在 WHERE 而不是在 SET 中抱怨。因此,它不太可能成为解决方案。

如果消息更改为大致相当于“ loginSET 子句中的未知列”的内容,则存在一些自洽性。

如果重命名表中的列并相应地修改代码会发生什么?


解析度

评论 N:

如果它允许SET login = ...而不是WHERE login = ...在单个语句中,那么我认为你有一个错误。我很惊讶; 它不像 DBMS(任何 DBMS)那样反复无常,所以在称它为错误之前我需要非常确定它。这也可能意味着这里还有另一个因素在起作用。如果您在行echo "Hi"后添加一个mysql_query() or die,那会通过吗?您实际上是在调试错误的 SQL 吗?也许之后有一个 SELECT 或其他格式错误的东西?

评论 N+1:

是的,谢谢!在我添加echo 'Hi';after 之后mysql_query,它出现了,所以问题出在我的下一个查询中。我知道这个问题很愚蠢。掌心

谁没有犯过类似的错误?

于 2012-05-09T14:29:58.667 回答
1

如果我的查询在 phpMyAdmin 中有效,但在代码中无效,我要做的第一件事就是更改

SELECT `column` FROM `table`

SELECT `column` FROM `database`.`table`

,或者当然与查询类似UPDATE。也许这是您的解决方案,而 MySQL 错误只是有点神秘。

编辑:

此外,不要使用norhtmlspecialcharsstrip_tags您的查询转义!这是不安全的,因为这不是预期的用途。要转义查询值,最好使用mysql_real_escape_string. 为正确的应用程序使用正确的转义函数。我会按如下方式编写您的查询:

$query = '
    UPDATE `' . $masterapp_users_table . '`
    SET `login` = "' . mysql_real_escape_string($_POST['login']) . '",
    `pass` = "' . md5($_POST['pass']) . '",
    `email` = "' . mysql_real_escape_string($_POST['email']) . '",
    `firstname` = "' . mysql_real_escape_string($_POST['fn']) . '",
    `secondname` = "' . mysql_real_escape_string($_POST['sn']) . '"
    WHERE `login` = "' . mysql_real_escape_string($_POST['previouslogin']) . '"
';
// To display it in your browser:
echo htmlspecialchars($query) . '<br />';
// To run it:
mysql_query($query) or die(mysql_error());

这只是一个友好的教训。错误的逃生功能会导致严重的安全漏洞。

于 2012-05-09T16:03:32.530 回答