【问题标题】:What is wrong with the SQL?SQL有什么问题?
【发布时间】:2011-11-21 16:54:47
【问题描述】:

我正在尝试使用 PDO,所以我把它放在一起:

所以,$_GET['word'] = "Jimi Hendrix"$_GET['cat'] = "music"

$now = htmlentities(rawurldecode($_GET['word']));
$cat = htmlentities($_GET['cat']); 

$dsn = 'mysql:dbname=DATABASE;host=localhost';
$user = "USER";
$password = "PASS";

# connect to the database
try {
    $DBH = new PDO($dsn, $user, $password);
                $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

                # the data to select 
                $data = array($cat, $now);

                $STH = $DBH->prepare("SELECT id, name FROM ? WHERE name LIKE ?");
                $STH->execute($data);
    $result = $STH->fetchAll();

}
catch(PDOException $e) {
    echo "Uh-Oh, something wen't wrong. Please try again later.";
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}

echo "<pre>";
print_r($result);
echo "</pre>";

但上面的代码正在返回:

SQLSTATE[42000]: Syntax error or access violation: 1064 You Have a Syntax error in your SQL near ''music' WHERE name LIKE 'Jimi Hendrix'' on line 1

【问题讨论】:

  • Off-Question-Topic: name LIKE 'Jimi Hendrix'name = 'Jimi Hendrix' 相似...您可以将其更改为 name LIKE '%Jimi Hendrix%' 也可以找到“Somebody feat. Jimi Hendrix(住在某处)'。另外,我会将nameword 压缩为小写,这样您就不会在案例部门遇到问题。

标签: php mysql sql pdo


【解决方案1】:

您不能将表名作为查询参数传递。您需要构造/执行动态 SQL 字符串。

【讨论】:

  • 该死。你的意思是: if($cat == "music"){...FROM music WHERE...} if($cat == "movies"){...FROM movies WHERE...} ?
  • 当你这样做时,要非常小心,并注意 SQL 注入的可能性......即验证你作为表名插入的字符串只包含在表名中有效的字符。
【解决方案2】:

这可能是因为您试图将表名作为参数插入。如有必要,您可以将其作为存储过程执行。

【讨论】:

    【解决方案3】:

    类别被转换成一个字符串,当查询准备好时它被转换成:

    SELECT id, name FROM 'cat' WHERE name 'music'

    表格不应该是字符串,你可以做的是:

    # the data to select 
    $data = array($now);
    
    $STH = $DBH->prepare("SELECT id, name FROM $cat WHERE name LIKE ?");
    $STH->execute($data);
    

    【讨论】:

      【解决方案4】:

      正如其他人所说,您不能使用 PDO(或我知道的任何其他 SQL 接口)参数化表名。

      您以前可以在这里找到表命名约定:

      http://www.mysql.com/doc/en/Legal_names.html

      但它是 Larry Ellisowned。

      我建议找到一个正则表达式来验证 MySQL 表名并使用它。一个基本的正则表达式是:

      /[A-Za-z][A-Za-z0-9_]*/ 
      

      但这不会考虑保留字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-11
        • 2016-06-28
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        相关资源
        最近更新 更多