从 4.1 升级到 MySQL 5.5 后,Php-MySQL UPDATE & INSERT 停止工作

Posted

技术标签:

【中文标题】从 4.1 升级到 MySQL 5.5 后,Php-MySQL UPDATE & INSERT 停止工作【英文标题】:Php-MySQL UPDATE & INSERT stopped working after upgrading to MySQL 5.5 from 4.1 【发布时间】:2014-05-14 04:17:33 【问题描述】:

昨晚 GD 突然将他们的 mysql 服务器从版本 4.1 更新到了 5.5。现在,我刚刚意识到将新数据行更新或插入到表中的算法不再起作用。这就是我所拥有的(自 2007 年以来我一直在使用相同的算法,没有任何问题,也许现在有点过时了):

    if($error_msg == "") 
        
            $sql = "UPDATE ".$db_prefix."cars SET
                stored='".$_POST['stored_year']."-".$_POST['stored_month']."-".$_POST['stored_day']."',
                year='".add_slashes($_POST['year'])."',
                model='".add_slashes($_POST['model'])."',
                type='".add_slashes($_POST['type'])."',
                typemodel='".add_slashes($_POST['typemodel'])."',
                bodystyle='".add_slashes($_POST['bodystyle'])."',
                engine='".add_slashes($_POST['engine'])."',
                trans='".add_slashes($_POST['trans'])."',
                drive='".add_slashes($_POST['drive'])."',
                color='".add_slashes($_POST['color'])."',
                condition='".add_slashes($_POST['condition'])."',
                millage='".add_slashes($_POST['millage'])."',
                vin='".add_slashes($_POST['vin'])."',
                price='".add_slashes(strip_out($_POST['price']))."',
                low='".add_slashes(strip_out($_POST['low']))."',
                high='".add_slashes(strip_out($_POST['high']))."',
                features='".$features_total."',
                comments='".add_slashes($_POST['comments'])."',
                mk_comment='".add_slashes($_POST['mk_comment'])."',
                title_page='".add_slashes($_POST['title_page'])."',
                certified='".add_slashes($_POST['certified'])."',
                sold='".add_slashes($_POST['sold'])."',
                sold_txt='".add_slashes($_POST['sold_txt'])."',
                se_index='".add_slashes($_POST['se_index'])."',
                one_owner='".add_slashes($_POST['one_owner'])."',
                special= '".$special."'
            WHERE id=".$_GET["id"];

    if(@mysql_query($sql)) die(header("Location: index.php?status=update"));
else
    $error_msg = "Record was not updated because of invalid data posted.";

我刚刚得到: “由于发布的数据无效,记录未更新。”

它没有显示任何其他错误。我刚刚读到这个post,它说从 MySQL 5.0 开始,您应该在表名之前包含数据库名称 $sql = "INSERT INTO database.table (columnOne, columnTwo)。 .. 但不确定。

如果您知道为什么此 UPDATE 不再起作用,我将非常感谢任何帮助。


编辑:摘自 OP 的评论:(对于那些想知道 add_slashes() 函数的用法的人)。

add_slashes 是从本地函数文件中插入的。

function add_slashes($string)  
        if (!get_magic_quotes_gpc()) 
                return addslashes($string); 
        else
                return $string; 

编辑:我尝试添加 mysql_error() 并得到:

您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,在第 12 行的 'condition='good', millage='7087', vin='2BFKOPP25B5YR501', price' 附近使用正确的语法

【问题讨论】:

一方面,看起来函数名实际上是add_slashes。 php.net/manual/en/function.addslashes.php 我在升级时遇到了 DATE、DATETIME 和 TIMESTAMP 列的一些问题,不确定您的列是否属于这些类型(看起来 stored 是 DATE 类型)。我通过删除列并重新添加它来修复它。这是一个包含更多信息的链接dev.mysql.com/doc/refman/5.5/en/… condition 是保留字dev.mysql.com/doc/refman/5.5/en/reserved-words.html,这很可能是@JohnA10 的原因 @Fred-ii- BINGO!尊重!非常感谢大师!我只是避开了condition='".add_slashes($_POST['condition'])."',,它现在可以工作了。看来我有很多工作要更改数据库中此变量的名称以及使用它的任何地方,哎哟! 不客气。很高兴我能帮助你。 @JohnA10 我刚才发布了一个答案,如果你想关闭它,它就不会一直无人回答。干杯 - 有一个反引号的例子。 【参考方案1】:

condition 是保留字http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html,这很可能是原因。

尝试(在单词condition 周围使用反引号)

`condition`='".add_slashes($_POST['condition'])."',

另外,如果可能的话,尝试使用另一个词作为列名。


在过去的 MySQL 版本中,condition 当时不是保留字,这解释了为什么它在您使用 4.1 并升级到 5.5 时对您有用。

http://dev.mysql.com/doc/refman/4.1/en/reserved-words.html

condition 自 5.0 版起成为保留字

http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html

脚注:

mysql_*函数弃用通知:

http://www.php.net/manual/en/intro.mysql.php

此扩展自 PHP 5.5.0 起已弃用,不推荐用于编写新代码,因为它将来将被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅MySQL API Overview 以获得更多帮助。

这些函数允许您访问 MySQL 数据库服务器。有关 MySQL 的更多信息,请访问 »http://www.mysql.com/。

可以在 »http://dev.mysql.com/doc/ 找到 MySQL 文档。

【讨论】:

一百万再次感谢,它现在正在工作(暂时在我更改列名时),将反引号添加到condition 非常欢迎约翰。找到解决方案总是一种很好的感觉。 @JohnA10 干杯 添加注释 John:如果 mysql_* 函数从未来的 PHP 版本中删除(最终),您可能希望在不久的将来开始编写一些新代码,如果 GoDaddy 升级他们的某个时候并得到一个你不会喜欢的惊喜。查看我的脚注。 @JohnA10 非常感谢脚注。是的,我正在阅读一些关于它的内容,我知道这是我必须尽快解决的问题。我有点担心,因为我还不确定我要怎么做,我对mysqli不太了解,mysql_query函数几乎在整个站点中使用了数百页,并且不确定这是否意味着我必须重新编辑整个 MySQL 代码。如您所见,我不是 MySQL 大师 :| 不客气,约翰。如果以及何时,您真正需要做的只是在其中添加一个i。例如:mysql_query() 将是 mysqli_query() 等。但是当关闭连接时,数据库连接变量需要在函数内部。即:在mysql_* 中你不需要DB 变量来关闭它mysql_close(); 但在mysqli_* 中你需要mysqli_close($con); 另外,一些其他功能也需要传递DB 连接,例如mysqli_real_escape_string() 是@987654346 @ 而不是 mysql_real_escape_string() 你不需要。 @JohnA10

以上是关于从 4.1 升级到 MySQL 5.5 后,Php-MySQL UPDATE & INSERT 停止工作的主要内容,如果未能解决你的问题,请参考以下文章

在 LAMPP for Ubuntu 中将 PHP 从 5.5 升级到 5.6

Lumen:在 routes.php 第 17 行:升级到 5.5 后调用未定义的方法 Laravel\Lumen\Application::post()。*

MySQL从5.5升级到5.6,TIMESTAMP的变化

MySQL 从 5.5 升级到 5.6,日期空条件失败

升级到5.6后Mysql在所有字段中搜索字符串变慢

MySQL:升级到 5.5 后我无法以 root 身份登录