在pg_query执行中遇到问题

时间:2010-09-09 08:26:32

标签: php postgresql

当我运行查询时

$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;
        }

我得到这样的输出....... 连接发生资源ID#2An发生错误。 为什么会出现这个错误。

3 个答案:

答案 0 :(得分:1)

使用pg_last_error()函数获取更详细的错误消息,如下所示:

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

答案 1 :(得分:1)

Insert into `advertiser_regidetdir`

反引号是一种MySQL引用功能,它不是标准ANSI SQL的一部分,在其他数据库中不可用。引用模式名称的ANSI语法是双引号。

令人遗憾的是,MySQL将双引号解释为单引号的同义词。如果您想编写可在MySQL和其他DBMS之间移植的代码,您需要:

  • 在整个过程中对模式名称使用​​双引号,并且在MySQL上打开sql_mode ANSI_QUOTES功能以使其符合标准,或者
  • 完全避免引用模式名称。这需要了解不同DBMS中存在哪些关键字的一般知识,以便您可以避免使用这些单词,但当然advertiser_regidetdir不是任何DBMS中的关键字,因此在没有引号的情况下非常有效。

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

除非你已经pg_escape_string编了这些值,否则这有点像SQL注入安全恐怖。

考虑参数化查询,特别是与pg模块一样pg_query_params,这使得它非常简单。

答案 2 :(得分:0)

使用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;
}
?>