如何在php变量中为选择查询转义撇号

时间:2015-04-25 15:18:05

标签: php mysql string mysqli escaping

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

  

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

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

以下是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);

echo转到浏览器:

    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");

输出      从team_name喜欢'St Patrick's Athletic%'

的球员中选择*

修改2

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

1 个答案:

答案 0 :(得分:4)

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()来清理您的输入。

我们在聊天过程中讨论过的问题已得到解决,但在聊天之前我已经提到了上述内容,毕竟这是解决方案。

相关问题