Я пытаюсь использовать 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
Категория преобразуется в строку, и когда запрос готов, он преобразуется в:
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);
Вы не можете передать имя таблицы в качестве параметра для запроса. Вам нужно будет построить / выполнить динамическую строку SQL.
Вероятно, это связано с тем, что вы пытаетесь вставить имя таблицы в качестве параметра. Если это возможно, вы можете сделать это как хранимую процедуру.
Как говорили другие, вы не можете параметризовать имя таблицы с помощью PDO (или любого другого SQL-интерфейса, о котором я знаю).
Вы имели обыкновение находить соглашения об именах таблиц здесь:
http://www.mysql.com/doc/en/Legal_names.html
Но это был Ларри Эллисон.
Я бы рекомендовал найти регулярное выражение для проверки имен таблиц MySQL и использования этого. Основным регулярным выражением было бы следующее:
/[A-Za-z][A-Za-z0-9_]*/
Но это не относится к зарезервированным словам.