получение проблемы при выполнении pg_query - PullRequest
0 голосов
/ 09 сентября 2010

Когда я выполняю свой запрос

$dbhost='localhost';
$dbuser='dbuser';
$dbpass='dbpass';
$dbname='dbname';

$conn=pg_connect('host='.$dbhost.' dbname='.$dbname.' user='.$dbuser.' password='.$dbpass); 
if (!$conn) {
  echo "An error occured.\n";
  exit;
}else{
echo "connection occured";
}
echo $conn;


        $insert=pg_query($conn, "Insert into `advertiser_regidetdir` 
        (user_name,domain_name,user_email,publickey,privatekey, refresh_count )
        values('$user','$domain','$email','$pubkey','$pritekey',0)");
        if (!$insert) {
          echo "An error occured.\n";
          exit;
        }

Я получаю что-то вроде этого ....... Произошло соединение с идентификатором ресурса # 2 Произошла ошибка. Почему эта ошибка идет.

Ответы [ 3 ]

1 голос
/ 09 сентября 2010
Insert into `advertiser_regidetdir`

Backticks - это функция цитирования MySQL, которая не является частью стандартного ANSI SQL и недоступна в других базах данных. Синтаксис ANSI для цитирования имени схемы - двойные кавычки.

К сожалению, MySQL интерпретирует двойные кавычки как синоним одинарных кавычек. Если вы хотите написать код, переносимый между MySQL и другими СУБД, вам необходимо:

  • используйте двойные кавычки для имен схем повсюду, а на MySQL включите функцию sql_mode ANSI_QUOTES, чтобы она соответствовала стандарту, или
  • избегать цитирования имен схем вообще. Это требует общих знаний о том, какие ключевые слова существуют в разных СУБД, поэтому вы можете избежать этих слов, но, конечно, advertiser_regidetdir не является ключевым словом ни в одной СУБД, поэтому вполне допустимо без кавычек.

.

values('$user','$domain','$email','$pubkey','$pritekey',0)

Если вы уже не pg_escape_string изменили эти значения, это немного старая нагрузка на ужас внедрения безопасности SQL.

Рассмотрим параметризованные запросы, особенно с модулем pg, который вы получаете pg_query_params , что делает его действительно простым.

1 голос
/ 09 сентября 2010

Используйте функцию pg_last_error () , чтобы получить более подробное сообщение об ошибке, подобное этому:

    if (!$insert) {
      echo "An error occured.\n";
      echo pg_last_error($conn);
      exit;
    }
0 голосов
/ 09 сентября 2010

Используйте pg_query_params (), чтобы избежать внедрения SQL и не используйте обратные пометки `, это не имеет ничего общего с SQL:

<?php
$dbhost='localhost';
$dbuser='dbuser';
$dbpass='dbpass';
$dbname='dbname';

$conn = pg_connect('host='.$dbhost.' dbname='.$dbname.' user='.$dbuser.' password='.$dbpass); 

if (!$conn) {
  echo "An error occured.\n";
  exit;
}else{
echo "connection occured";
}
echo $conn;

$query = '
    INSERT INTO advertiser_regidetdir
        (user_name,domain_name,user_email,publickey,privatekey, refresh_count )
    VALUES($1, $2, $3, $4, $5, 0)'; // 5 placeholders

$insert = pg_query_params(
            $conn,
            $query,
            array($user, $domain, $email, $pubkey, $pritekey) // array with values
            );

if (!$insert) {
    echo "An error occured.\n";
    exit;
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...