为什么postgresql不用php更新查询

时间:2015-02-10 21:18:21

标签: php postgresql

我在php代码上遇到pg_query()问题。 当我发送我的请求时,我有这个错误:

2015-02-10 16:57:16.793 Ambilly[658:191087] PHP Warning:  pg_query():  in C:\inetpub\www.blabla.com\stoun\modifbati.php on line 22

这是我的代码:

<?php
session_start();
//On inclue les librairies
include('connect.php');
//on regarde si il y a eu un envoi ou non
if(isset($_POST['objectid'])&&isset($_POST['hauteur'])&&isset($_POST['occupation'])&&isset($_POST['nbr_niveau'])&&isset($_POST['nbr_lot'])&&isset($_POST['observation'])){
$codeID = $_POST['objectid'];
$hauteur = $_POST['hauteur'];
$occupation = $_POST['occupation'];
$nbrNiveau = $_POST['nbr_niveau'];
$nbrLot = $_POST['nbr_lot'];
$observation = $_POST['observation'];
//echo $code;
$conn = pg_pconnect("host=localhost port=5432 dbname=xxxxx user=xxxx password=xxxx");
if (!$conn) {
    echo "An error occurred.\n";
    exit;
}
//on fait le fichier
$date = date("Y-m-d");

$result = pg_query($conn, "UPDATE `suivi_bati` SET `hauteur`='".$hauteur."', `occupation`='".$occupation."', `nbr_niveau`='".$nbrNiveau."', `nbr_lot`='".$nbrLot."', `observation`='".$observation."'  WHERE `objectid`='".$codeID."'");
if (!$result) {
    echo "UPDATE IMPOSSIBLE";
    echo pg_last_error();
    exit;
} else {
    echo "FICHE BATI MODIFIER";
 }
}
else {
    echo "Pas possible";
}
?>

有什么想法吗? 谢谢 Stoun

1 个答案:

答案 0 :(得分:2)

此查询无效:

$result = pg_query($conn, "UPDATE `suivi_bati` SET `hauteur`='".$hauteur."', `occupation`='".$occupation."', `nbr_niveau`='".$nbrNiveau."', `nbr_lot`='".$nbrLot."', `observation`='".$observation."'  WHERE `objectid`='".$codeID."'");

因为在PostgreSQL中,标识符周围的反引号字符在语法上是无效的。删除它们,此查询中使用的名称(小写ASCII)无论如何都不需要引号。

此外,pg_escape_string需要应用于来自POST的变量,否则您的查询很容易被SQL注入。

使用sprintf:

,固定查询可能如下所示
$result = pg_query($conn,
           sprintf("UPDATE suivi_bati SET
                hauteur='%s',
                occupation='%s',
                nbr_niveau='%s',
                nbr_lot='%s',
                observation='%s'
            WHERE objectid='%s'",
              pg_escape_string($hauteur),
              pg_escape_string($occupation),
              pg_escape_string($nbrNiveau),
              pg_escape_string($nbrLot),
              pg_escape_string($observation),
              pg_escape_string($codeID))
          );

或更现代的pg_query_params,它不需要显式转义,也不需要单引号围绕文字:

$result = pg_query_params($conn,
           "UPDATE suivi_bati SET
                    hauteur=$1,
                    occupation=$2,
                    nbr_niveau=$3,
                    nbr_lot=$4,
                    observation=$5
            WHERE objectid=$6",
              array($hauteur,
              $occupation,
              $nbrNiveau,
              $nbrLot,
              $observation,
              $codeID)
          );