包含关键字/保留词的PHP MySQL查询[重复]

Posted

技术标签:

【中文标题】包含关键字/保留词的PHP MySQL查询[重复]【英文标题】:PHP MySQL query containing keywords/reserved words [duplicate] 【发布时间】:2016-02-02 02:23:54 【问题描述】:

我在更新包含 html 数据的 mysql 数据时遇到了问题,我不断修复错误;但是,一旦一个错误得到修复,它就会给出另一个错误。当前错误如下:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'desc='Live updates to certain games will also be posted on this website througho' at line 1

我在 Stack Overflow 上搜索了将近 3 天,但没有任何明确的答案。所以我希望有人能找到这个!

这是我的 php 表单代码:

 if (isset($_POST['submit']))  
    $WName = mysql_prep($_POST['wname']);
    $SName = mysql_prep($_POST['sname']);
    $Desc = mysql_prep($_POST['desc']);
    $LogoURL = mysql_prep($_POST['logourl']);
    $aboutPage = mysql_prep($_POST['aboutpage']);
    $query = "UPDATE settings SET name='$WName',subName='$SName',desc='$Desc',logoUrl='$LogoURL',about='$aboutPage'";
    // $query = mysql_prep($query);
    mysql_query($query) or die(mysql_error());
     header("Location: settings.php?=success");
  

功能

mysql_prep()
可以在网上找到,即这里:https://gist.github.com/ZachMoreno/1504031

这是 HTML 表单:

<form role="form" action="" method="post">
    <!-- text input -->
    <div class="form-group">
        <label>Website Name</label>
        <input type="text" name="wname" class="form-control" placeholder="
            <?php echo $row['name']; ?>" value="
            <?php echo $row['name']; ?>" />
        </div>
        <div class="form-group">
            <label>Sub Name</label>
            <input type="text" name="sname" class="form-control" placeholder="
                <?php echo $row['subName']; ?>" value="
                <?php echo $row['subName']; ?>" />
            </div>
            <div class="form-group">
                <label>Description</label>
                <textarea name="desc" class="form-control" rows="3" placeholder="
                    <?php echo $row['desc']; ?>" >
                    <?php echo $row['desc']; ?>
                </textarea>
            </div>
            <div class="form-group">
                <label>Logo URL</label>
                <input type="text" name="logourl" class="form-control" placeholder="
                    <?php echo $row['logoUrl']; ?>" value="
                    <?php echo $row['logoUrl']; ?>"  />
                </div>
                <div class="form-group">
                    <label>About Page</label>
                    <textarea class="form-control" name="aboutpage" rows="6" placeholder="
                        <?php echo $row['about']; ?>">
                        <?php echo $row['about']; ?>
                    </textarea>
                </div>
                <div class="box-footer">
                    <input type="submit" name="submit" class="btn btn-primary" value="Submit" style="margin-left:-10px;" />
                </div>
            </form>

非常感谢您提供的任何帮助,我希望可以解决这个问题,我的目标是帮助未来遇到相同/类似问题的访问者。

【问题讨论】:

应该使用 mysqli_ 函数和 mysqli_real_escape_string() 函数,而不是旧的、已弃用的 mysql_ 函数。 你能var_dump($query) 并发布结果 使用htmlspecialchars()mysqli_real_escape_string()怎么样? 不幸的是,这个项目被要求使用旧的不推荐使用的 MySQL。 @MaggsWeb,我现在就这样做。 【参考方案1】:

不敢相信我之前没有看到这个;我对 MySQL 的问题是数据库有列名“desc”,我最初认为它表示“description”,但实际上它与关键字“descending”冲突。这给出了语法错误。

这是我在 MySQL 文档中找到的; 9.3 Keywords and Reserved Words :

关键字是在 SQL 中具有重要意义的词。某些关键字(例如 SELECT、DELETE 或 BIGINT)是保留的,需要特殊处理才能用作标识符,例如表名和列名。内置函数的名称也可能如此。

在上面的网页链接上,您可以看到不应使用或应包含反斜杠(我不会详细介绍)的关键字/保留字列表。

我的解决方案?不要使用保留字作为标识符!

您可以做的最简单的解决方案是简单地避免使用这些词。我通过将标识符更改为“描述”来阻止使用保留字“描述”。

感谢您的所有帮助!希望这对未来的人们有所帮助。

【讨论】:

【参考方案2】:

从您的 mysql_prep() 函数返回的字符串已转义单引号。 所以.. ..您不能在查询字符串中使用这些作为分隔符。将它们更改为双引号。

$query = "UPDATE settings SET name    = \"$WName\", 
                              subName = \"$SName\", 
                              desc    = \"$Desc\", 
                              logoUrl = \"$LogoURL\", 
                              about   = \"$aboutPage\" ";

你可以试试$testQuery 只带文字吗..

$testQuery = "UPDATE settings SET name    = \"ABC\", 
                                  subName = \"DEF\", 
                                  desc    = \"GHI\", 
                                  logoUrl = \"JKL\", 
                                  about   = \"MNO\" ";

另外,您缺少 WHERE 子句,还是只有 1 行?

【讨论】:

“解析错误:语法错误,意外的 '$WName' (T_VARIABLE) in...”在 $query 行上。 好的,试试转义双引号 "您的 SQL 语法有错误;....... near 'desc = "某些游戏的实时更新也将发布在本网站的第 3 行 thr'" 另一个 SQL语法错误。(我将错误减少了一点,但它与原帖中的原始错误相同) 设置只有一行,多列;但是,我确实有一行的 ID(id = 1),您的测试查询也给了我:您的 SQL 语法有错误; ..... 'desc = "GHI", logoUrl = "JKL", ' 在第 3 行附近。 听起来您的问题与数据库有关,而不是您的查询字符串。您是否检查过列名(和大小写)匹配?你在任何地方都捕捉到 `mysql_error()' 吗?

以上是关于包含关键字/保留词的PHP MySQL查询[重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询怎么去除重复列

MySql 查询结果不包含重复

mysql查询时如何去除重复数据

php+mysql模糊查询功能

mysql 当有多个角色 大部分信息重复时怎么建表

解析mysql中:单表distinct多表group by查询去除重复记录