Синтаксис PHP для имен таблиц в смешанном регистре - PullRequest
1 голос
/ 13 мая 2010

У меня есть код ниже:

<?php
require "institution.php"
/* in this portion, query for database connection is executed, and  */

$institution= $_POST['institutionname'];

$sCampID =  'SELECT ins_id FROM institution where ins_name= '$institution' ';
$qcampID = pg_query($sCampID) or die("Error in query: $query." . pg_last_error($connection));
/* this portion outputs the ins_id */           
?>

Моя база данных ранее не имеет имен таблиц в смешанном регистре, поэтому, когда я запускаю этот запрос, она вообще не выдает ошибки. Но поскольку по некоторым причинам я изменил свою базу данных, и теперь она содержит имена таблиц в смешанном регистре, я должен изменить приведенный выше код на этот:

$sCampID =  'SELECT ins_id FROM "Institution" where ins_name= '$institution' ';

где Учреждение должно быть в двойных кавычках. Запрос вернул ошибку разбора. Когда я удалил эту часть: где ins_name = '$ agency', ошибки не произошло.

У меня вопрос, как мне решить эту проблему, когда имя таблицы, которая содержит букву в смешанном регистре и значение, хранящееся в переменной (в нашем случае это $ institute), будет объединено в один оператор select?

Ваши ответы и предложения будут очень благодарны.

Ответы [ 5 ]

1 голос
/ 13 мая 2010
<?php
require "institution.php"
/* in this portion, query for database connection is executed, and  */

$institution= pg_escape_string($_POST['institutionname']);

$sQuery =  "SELECT ins_id FROM \"Institution\" where ins_name= '$institution'";
$qcampID = pg_query($sQuery) 
  or trigger_error("Error in query: $sQuery." . pg_last_error($connection));
/* this portion outputs the ins_id */           
?>

Примечание

  • pg_escape_string как следует использовать, не для защиты от каких-либо инъекций, а как часть синтаксиса.
  • trigger_error, который следует использовать вместо echo (и запомните правильное имя переменной)
  • и двойные кавычки или ваша переменная не будет экстраполирована (http://php.net/types.string для ссылки)
  • и косая черта в двойных кавычках (та же ссылка)
1 голос
/ 13 мая 2010

Вы можете использовать двойную кавычку вместо

$sCampID =  "SELECT ins_id FROM \"Institution\" where ins_name= '$institution'";
0 голосов
/ 13 мая 2011

Что произойдет, если $ institute содержит следующую строку: 'or 1 = 1; -

Это то, что мы называем атакой с использованием SQL-инъекций, и это очень простой способ для хакеров украсть ваши данные и доставить вам большие неприятности с вашими клиентами.

Вам нужно экранировать эту строку с помощью pg_escape_string (), прежде чем помещать ее в SQL-запрос. Мне нравится использовать sprintf () для построения моих запросов:

$sql = sprintf("SELECT ins_id FROM \"Institution\" where ins_name= '%s'", pg_escape_string($conn, $institution));

В приведенном выше примере $ conn - это идентификатор соединения, созданный путем вызова pg_connect ().

0 голосов
/ 13 мая 2010

Чтобы добавить к другим ответам (указать имя таблицы и использовать подготовленные операторы для повышения безопасности и производительности), прочитайте о PG и чувствительности к регистру таблиц . Если у вас есть опция, вы можете изменить схему БД, чтобы имена таблиц (а также столбцы и идентификаторы в целом) были строчными. Это немного упростит ваши запросы - (но потребует, чтобы вы проверили все ваши фактические процитированные запросы и удалили их из кавычек).

0 голосов
/ 13 мая 2010
$sCampID =  'SELECT ins_id FROM "Institution" where ins_name= \''.$institution.'\'';

Строка убегает.

Как написал другой комментатор, читайте о внедрении SQL. То, что у меня есть, небезопасно для инъекций, подумайте об использовании чего-либо с подготовленными утверждениями, предпочтительно PDO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...