2013-05-19 2 views
3

Я пытаюсь запросить столбец mysql, который имеет имя «5». Это выводит неверный столбец с именем «22».Я пытаюсь запросить столбец mysql, который имеет имя «5». Это выводит неверный столбец с именем «22»

Это мой php-код, $pid - это переменная, которую я получаю от приложения Android и всегда является номером. Когда я ищу с $pid = 5, вместо получения столбца «5» с artist1, он получает столбец «22» с вечным1.

В основном это путает имя столбца с # на первом экране печати. Если # не существует, то он выполняется правильно; поэтому, если я ищу с 16, я получаю столбец 16. Как это исправить?

$pid = $_GET["pid"]; 

$result=mysql_query("SELECT * FROM TableComments WHERE `$pid` IS NOT NULL "); 

http://imgur.com/WFsfEtB

http://imgur.com/rZA27XC

+0

'$ result = mysql_query (" SELECT * FROM TableComments WHERE pid = 5) ' – samayo

+7

Имена столбцов, начинающиеся с числа, задают проблемы. – Patashu

+0

Это должно быть' WHERE '$ pid'' (wrapping $ pid in backticks) .Когда я действительно хотел бы знать, это то, что было в виду, кто бы ни думал об этой схеме именования. – raina77ow

ответ

1

Оберните имя столбца в обратные кавычки:

SELECT * FROM TableComments WHERE `$pid` IS NOT NULL 

Начните использовать PDO вместо старых, небезопасны и осуждается mysql_*

+1

Это немного запутанно из-за значения обратных тиков в диалекте wikitext StackOverflow, но я думаю, что код OP уже выглядел так: http://stackoverflow.com/revisions/aafcdae0-a323-400f-ad3e-15a6ba9f1a15/view -source – IMSoP

+0

@IMSoP ОК, вы правы, не знал. – michi

+0

Спасибо за ответы. Я начал изучать PDO и фактически решил эту конкретную проблему в дополнение к предотвращению инъекций SQL. – Jerome

2

Это б y в SQL-диалектах, о которых я могу думать небрежно. Я знаю нескольких людей, которые по привычке добавляют order by 0 desc или order by 1 к специальным запросам, первым выбирающим то, что обычно является столбцом идентификатора, а второе, что часто является столбцом «Имя» или аналогичным. Они запрашивают, основываясь на порядковой позиции поля в запросе (или схеме, в случае *)

Чтобы получить столбец с именем 5, вам необходимо использовать соответствующий механизм SQL-цитирования для вашего диалекта и конфигурации. Например, Microsoft Sql и Access обычно используют select * from tablecomments where [5]=5; в Postgres и Oracle вы должны использовать select * from tablecomments where "5"=5, а в Mysql котируемые идентификаторы котируются с обратным адресом select * from tablecomments where `5`=5. В Microsoft SQL вы также можете сделать вещи более похожими на Oracle и Postgres, если ваш сеанс имеет SET QUOTED_IDENTIFIER ON, и в этом случае вы использовали бы кавычки вместо квадратных скобок.

Как в стороне, но очень важно, вы не должны вводить пользователя и напрямую вставлять его в SQL. Если кто-то перехватил передачу HTTP между вашим Android-приложением и вашим PHP-приложением (тривиально с прокси, например, Charles или Fiddler), они смогут воспроизвести HTTP-запрос с произвольным SQL-инъекцией. Как отмечали другие комментаторы, вместо этого используйте параметризованный запрос.

Поскольку вы пытаетесь изменить сам запрос, а не параметры, вам может потребоваться указать разрешенные имена полей (или сравнить строку, которую вы отправили, с полями, представленными в схеме).

+0

В MySql это backticks не двойные кавычки. Postgres - это двойные кавычки. Невозможно говорить за Oracle – Basic

+1

Исправлено. Моя память о MySql туманна, и я много раз бил головой о стол. – JasonTrue

+1

+1 для подробного объяснения; **, но ** код OP, похоже, содержит обратные тики ... – IMSoP

Смежные вопросы