Intereting Posts

Что не так с SQL?

Я пытаюсь использовать 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_]*/ 

Но это не относится к зарезервированным словам.