【问题标题】:PHP MySQL query containing keywords/reserved words [duplicate]包含关键字/保留词的PHP MySQL查询[重复]
【发布时间】: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,我现在就这样做。

标签: php html mysql database


【解决方案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()' 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    相关资源
    最近更新 更多