当我运行查询时
$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发生错误。 为什么会出现这个错误。
答案 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之间移植的代码,您需要:
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;
}
?>