SQL有什么问题?

时间:2011-11-21 16:54:48

标签: php mysql sql pdo

我试图使用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

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

将类别转换为字符串,并在准备查询时将其转换为:

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

答案 3 :(得分:0)

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

您曾经在这里找到表命名约定:

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

但这是Larry Ellis拥有的。

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

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

但那不会占用保留字。