插入查询在服务器上不起作用

时间:2017-03-13 14:39:38

标签: php postgresql

下面的代码在我的本地服务器上运行没有任何问题。但是,当我尝试在预期的服务器上运行它时,我的两个查询都不起作用 - 它们不像它们应该的那样INSERT。我已经标记了两个不能用于评论的查询,其余的工作。目标服务器在PHP 5.6.30-0 + deb8u1上运行。

更新:感谢aynber,我已经跟踪了错误。这是第一个查询的错误:预处理语句\“editRecord \”不存在“我不明白为什么它在本地服务器上工作但在预期的服务器上不工作。

准备好的语句和执行之间的

更新2:错误:语法错误位于或接近\“ON \”\ nLINE 3:

case "editRecord":

$id = openPandoraBox(post("id"));
$tutorAbsence = post("tutorAbsence");
$clientAbsence = post("clientAbsence");

if($tutorAbsence == "1") {

    if(post("tutor") != "0") {
        //  ------------this query does not work.-----------
        $absUpsSql = "INSERT INTO tutorabsence(id, tutorid, reason)
                      VALUES ($1, $2, $3)
                      ON CONFLICT (id)
                      DO UPDATE SET tutorid=$2, reason=$3";

        $absUpsPrep = pg_prepare($conn, 'editRecord', $absUpsSql);
        $absUpsQry = pg_execute($conn, 'editRecord',
                                array($id, post("tutor"), post("tutorreason"))
                     );
    } else {
        $tutorAbsence = "0";
    };
} else {
    $absDelSql = "DELETE FROM tutorabsence WHERE id=$1";
    $absDelPrep = pg_prepare($conn, 'absDel', $absDelSql);
    $absDelQry = pg_execute($conn, 'absDel', array($id));
};

if($clientAbsence == "1"){ 
    if(post("client") != "0") {
        //  ------------this query does not work.-----------
        $absUpsSql = "INSERT INTO clientabsence(id, clientid, reason)
                      VALUES ($1, $2, $3)
                      ON CONFLICT (id)
                      DO UPDATE SET clientid=$2, reason=$3";

        $absUpsPrep = pg_prepare($conn, 'absUps', $absUpsSql);
        $absUpsQry = pg_execute($conn, 'absUps',
                                array($id, post("client"), post("clientreason"))
                     );
    } else {
        $clientAbsence = "0";
    };
} else {
    $absDelSql = "DELETE FROM clientabsence WHERE id=$1"; 
    $absDelPrep = pg_prepare($conn, 'absDelOne', $absDelSql);
    $absDelQry = pg_execute($conn, 'absDelOne', array($id));
};

$resultSql = "UPDATE appointments
                 SET hour=$1, tutorid=$2, 
                     clientid=$3,  purpose=$4, 
                     tutornotshown=$5, clientnotshown=$6
              WHERE appid=$7"; 
$resultPrep = pg_prepare($conn, 'resultSql', $resultSql);
$result = pg_execute($conn, 'resultSql',
                     array(post('hour'), post("tutor"), post("client"),
                           post("purpose"), $tutorAbsence, $clientAbsence, $id
                     )
          );

echo json_encode(array("success" => 1));
break;

2 个答案:

答案 0 :(得分:1)

  

更新2:预准备语句和执行之间的错误:语法错误在\" ON \" \ nLINE 3:

如果它在本地服务器上运行但在生产服务器上不运行,则很可能它们不会运行相同版本的PostgreSQL。 ON CONFLICT是PostgreSQL 9.5(https://www.postgresql.org/docs/9.5/static/sql-insert.html)发布的一个功能,它仍然是最新的。

您应该在生产服务器上运行此查询以检查它使用的PostgreSQL版本:

SELECT version();

您的服务器可能运行PostgreSQL 9.5或9.6,而生产服务器可能是旧版本。

答案 1 :(得分:0)

9.5以下的PostgreSQL Upsert太复杂了。我的时间很短,所以我只会使用SELECT COUNT(*)和if。