将“ INSERT” MySQL查询转换为Postgresql查询

时间:2019-01-29 13:32:12

标签: php mysql postgresql

我被困了一段时间来解决此问题。我关注了这篇文章https://www.sitepoint.com/creating-a-scrud-system-using-jquery-json-and-datatables/ 创建SCRUD系统。但是当我需要向PostgreSQL添加新记录时,我陷入了困境。

该代码的有效MySQL部分是:

$db_server   = 'localhost';
$db_username = 'root';
$db_password = '123456';
$db_name     = 'test';
$db_connection = mysqli_connect($db_server, $db_username, $db_password, $db_name);
$query = "INSERT INTO it_companies SET ";
if (isset($_GET['rank']))         { $query .= "rank         = '" . mysqli_real_escape_string($db_connection, $_GET['rank'])         . "', "; }
if (isset($_GET['company_name'])) { $query .= "company_name = '" . mysqli_real_escape_string($db_connection, $_GET['company_name']) . "', "; }
if (isset($_GET['industries']))   { $query .= "industries   = '" . mysqli_real_escape_string($db_connection, $_GET['industries'])   . "', "; }
if (isset($_GET['revenue']))      { $query .= "revenue      = '" . mysqli_real_escape_string($db_connection, $_GET['revenue'])      . "', "; }
if (isset($_GET['fiscal_year']))  { $query .= "fiscal_year  = '" . mysqli_real_escape_string($db_connection, $_GET['fiscal_year'])  . "', "; }
if (isset($_GET['employees']))    { $query .= "employees    = '" . mysqli_real_escape_string($db_connection, $_GET['employees'])    . "', "; }
if (isset($_GET['market_cap']))   { $query .= "market_cap   = '" . mysqli_real_escape_string($db_connection, $_GET['market_cap'])   . "', "; }
if (isset($_GET['headquarters'])) { $query .= "headquarters = '" . mysqli_real_escape_string($db_connection, $_GET['headquarters']) . "'";   }
$query = mysqli_query($db_connection, $query);

我设法编写了此代码,但它不适用于PostgreSQL:

$conn_string = "dbname=test user=postgres password=123456";
$query = "INSERT INTO it_companies VALUES ";
if (isset($_GET['rank']))         { $query .= "('" . pg_escape_string($db_connection, $_GET['rank'])         . "', "; }
if (isset($_GET['company_name'])) { $query .= "'" . pg_escape_string($db_connection, $_GET['company_name']) . "', "; }
if (isset($_GET['industries']))   { $query .= "'" . pg_escape_string($db_connection, $_GET['industries'])   . "', "; }
if (isset($_GET['revenue']))      { $query .= "'" . pg_escape_string($db_connection, $_GET['revenue'])      . "', "; }
if (isset($_GET['fiscal_year']))  { $query .= "'" . pg_escape_string($db_connection, $_GET['fiscal_year'])  . "', "; }
if (isset($_GET['employees']))    { $query .= "'" . pg_escape_string($db_connection, $_GET['employees'])    . "', "; }
if (isset($_GET['market_cap']))   { $query .= "'" . pg_escape_string($db_connection, $_GET['market_cap'])   . "', "; }
if (isset($_GET['headquarters'])) { $query .= "'" . pg_escape_string($db_connection, $_GET['headquarters']) . "');";   }
$query = pg_query($db_connection, $query);

我从系统收到的消息是:“添加请求失败:parsererror”

“编辑”和“删除”功能运行良好。

接下来,我将从PGSQL网站示例中构建此子句:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes');

我做错了什么吗?谢谢!

更新 查询和错误的回显是id列。在Mysql代码中,ID列没有问题。为什么当我使用pgsql时呢?

INSERT INTO it_companies (rank,company_name,industries,revenue,fiscal_year,employees,market_cap,headquarters) 
VALUES ('1', 'asd', 'asd', '1', '2000', '2', '3', 'asdf');

    Warning: pg_query(): Query failed: ERROR: duplicate key value violates unique constraint "it_companies_pkey" DETAIL: Key (company_id)=(2) already exists. in C:\WEB\Apache24\htdocs\datatableeditor\data.php on line 121
        {"result":"error","message":"query error"

,"data":[]}

UPDATE2 具有一个错误的工作代码:

$query = "INSERT INTO it_companies (rank,company_name,industries,revenue,fiscal_year,employees,market_cap,headquarters) VALUES ";
if (isset($_GET['rank']))         { $query .= "('" . $_GET['rank']         . "', "; }
if (isset($_GET['company_name'])) { $query .= "'" . $_GET['company_name'] . "', "; }
if (isset($_GET['industries']))   { $query .= "'" . $_GET['industries']   . "', "; }
if (isset($_GET['revenue']))      { $query .= "'" . $_GET['revenue']      . "', "; }
if (isset($_GET['fiscal_year']))  { $query .= "'" . $_GET['fiscal_year']  . "', "; }
if (isset($_GET['employees']))    { $query .= "'" . $_GET['employees']    . "', "; }
if (isset($_GET['market_cap']))   { $query .= "'" . $_GET['market_cap']   . "', "; }
if (isset($_GET['headquarters'])) { $query .= "'" . $_GET['headquarters'] . "') RETURNING company_id;";   }
echo $query;

查询后,消息“添加请求失败:parsererror”仍然存在。但是在手动刷新页面后,将保存新数据。知道为什么此消息消失并且不自动加载数据吗?

更新3-成功 我忘记从导致错误消息的代码中删除echo $query;。 现在一切正常。感谢大家的帮助! :)

1 个答案:

答案 0 :(得分:1)

您需要在查询字符串构建中做更多的工作。

仅当存在等级时,才添加括号(

如果存在总部,则仅添加右括号)

还需要指定哪个字段列将获得哪个值,否则,在headquarter字段中以fiscal_year结尾。如果未指定列,则按表中定义的顺序添加值。

INSERT INTO TABLE_NAME (column1, column2, column3,...columnN)
VALUES (value1, value2, value3,...valueN);

其他人有评论时,请检查$query来查看您拥有的东西。