【问题标题】:How to escape apostrophe in php variable for select query如何在选择查询的 php 变量中转义撇号
【发布时间】:2015-04-25 15:18:05
【问题描述】:

我尝试使用 mysqli_real_escape_string 转义查询字符串和包含撇号的$variable,变量值来自数据库。我收到以下错误。

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '\'Shamrock Rovers%\' AND away_team like \'St Patrick's Athletic%\'' 附近使用正确的语法

撇号不会被比较值周围的引号转义。

这是出现在 PHP 文件中的查询:

    $homeTeam = filter_input(INPUT_GET, 'homeTeam', FILTER_SANITIZE_STRING);
    $homePlayers = "select * from players where team_name like $homeTeam";
    $homePlayers = mysqli_real_escape_string($dbc, $homePlayers);
    $homePlayersResult = mysqli_query($dbc, $homePlayers);

然后echoed 到浏览器:

    select * from players where team_name like Shamrock Rovers

我已经尝试了许多不同的方法,但结果没有变化我觉得我忽略了一些简单的事情。 提前致谢。

编辑 1

更新代码

$homeTeam = filter_input(INPUT_GET, 'homeTeam', FILTER_SANITIZE_STRING);          
$homeTeam = mysqli_real_escape_string($dbc, $homeTeam);
echo "<br>".$homeTeam."<br>";
$homePlayers = "select * from players where team_name like '$homeTeam%'";

$homePlayersResult = mysqli_query($dbc, $homePlayers);

此脚本从处理脚本中接收 3 个参数

header("location: ../scorer.php?gameWeek=$gameWeek&homeTeam=$homeTeam&awayTeam=$awayTeam");

输出 select * from player where team_name like 'St Patrick's Athletic%'

编辑 2

在 mysql 命令窗口中输入查询后,当我提交一次查询时没有任何反应,但是当我再次输入时,我得到以下错误。

【问题讨论】:

    标签: php mysql string mysqli escaping


    【解决方案1】:
    like $homeTeam";
    

    你需要引用那个变量。

    like '$homeTeam'";
    

    like '$homeTeam%'";
    

    因为这是一个字符串,根据您的like Shamrock Rovers

    但我不知道你为什么要使用

    $homePlayers = mysqli_real_escape_string($dbc, $homePlayers);
                                                   ^^^^^^^^^^^^
    

    在转义查询时:(?)

    $homePlayers = "select * from players where team_name like $homeTeam";
    ^^^^^^^^^^^^
    

    您可能打算使用:

    $homePlayers = mysqli_real_escape_string($dbc, $homeTeam);
    


    编辑:(测试)

    这是我用来成功查询我的测试表的,是“用户”。

    <?php
    
    $DB_HOST = 'xxx';
    $DB_USER = 'xxx';
    $DB_PASS = 'xxx';
    $DB_NAME = 'xxx';
    
    $Link = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
    if($Link->connect_errno > 0) {
      die('Connection failed [' . $Link->connect_error . ']');
    }
    
    $_GET['homeTeam'] = "St Patrick's Athletic";
    
    $username = $_GET['homeTeam'];
    
    $homeTeam = filter_input(INPUT_GET, 'homeTeam', FILTER_SANITIZE_STRING);
    $homePlayers = mysqli_real_escape_string($Link, $homeTeam);
    $homePlayers = "select * from users where username like '$homeTeam%'";
    $homePlayersResult = mysqli_query($Link, $homePlayers);
    
    echo "Names found like: " . $username;
    
    echo "<br>";
    
     while($row = mysqli_fetch_array($homePlayersResult)){
    
    echo $row['username'];
    
    echo "<br>";
    
    echo "<a href=\"{$row['my_row']}\">".$row['my_row']."</a>";
    
    echo "<br>";
    
    }
    
    • 另外,请确保您的列确实是 VARCHAR 并且它的长度足够长,并且您的输入是“文本类型”。

    旁注:

    你不需要这个会破坏你的查询:

    $homeTeam = filter_input(INPUT_GET, 'homeTeam', FILTER_SANITIZE_STRING);
    

    因为您已经在使用 mysqli_real_escape_string() 来清理您的输入。

    我们在聊天中讨论过的事情已经解决了,但我在聊天之前已经提到了上面的内容,这毕竟是解决方案。

    【讨论】:

    • 我不喜欢看到mysqli_real_escape_string,我宁愿人们只使用查询绑定,但这只是我的意见
    • @Zarathuztra 确实;参数化是一种更好的方法,已添加到我的答案中。
    • 这确实解决了不带参数的查询的问题,这些参数包含特殊字符但带有特殊字符的查询没有错误但没有结果。将更新问题
    • @Lonergan6275 您应该“添加”到您的问题中,而不是覆盖您的原始帖子并在其下标记为“编辑”。请把它编辑成这样,否则人们会看到你的问题和我的答案并说/问自己“为什么是答案?”
    • @Lonergan6275 我已经完成了回滚。现在,我已经测试了您的代码以及我的修复程序并且成功了。几分钟后,我将在我的答案下添加一段示例代码。但是,我不知道你从哪里得到你的 GET,所以我只发布一个例子。给我几分钟,我会在底部附近的答案下发布它。
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2016-03-07
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多