如何使PHP动态Postgres的准备语句(How to make dynamic postgres

2019-09-21 07:30发布

我试图让使用的是Postgres在PHP一些准备语句。

这是一个有点难以explaing所以我只是告诉你:

$stmt = "SELECT * FROM customer WHERE zip = '$1'";

if(isset($_POST["CITY"])){ 
   $stmt .= "AND city = '$2'";
}

if(isset($_POST["COUNTRY"])){ 
   $stmt .= "AND country = '$3'";
}

$result = pg_prepare("myconnection", "my query", $stmt);

$result1 = pg_execute("myconnection","my query", array("0000","someCity","someCountry"));

很抱歉,如果一些代码是错误的,但它是一个写意的例子。 我需要的是能够使准备好的声明动视,如果一些变量isset /不空。 它似乎并不在数组中张贴3个变量的时候,当语句只预计1或工作,如果我只需要添加$ 1和$ 3,但不是$ 2。 我希望你明白。

我需要使用它这个周末,所以我希望有人知道!

先感谢您!

Answer 1:

在一份声明中,SQL是有意的静态 。 一旦完成语句的准备的参数个数不能改变。

但它会很容易为你的代码提交的取决于语句的参数正确的数字。 你可以添加一个变量的参数柜台,和一个动态PHP数组传递给pg_execute,而不是硬编码的文字。 他们将递增/填充里面if (isset(...))的分支。



Answer 2:

有没有错的有3个不同的报表(每个案件),并执行,取决于传递的参数的数量适用的一个。 例:

编辑:我修改了代码,以匹配所有情况:

  • 只有指定的拉链
  • 邮政编码城市
  • 邮政编码国家
  • 邮编+城市+国家

(即使有其他一些情况下,你会明白的想法)

$stmt = "SELECT * FROM customer WHERE zip = '$1'";

if(isset($_POST["CITY"]) && isset($_POST["COUNTRY"])) { 
   $stmt3 = $stmt . " AND city = '$2'" . " AND country = '$3'";
} elseif(isset($_POST["CITY"])) { 
   $stmt1 = $stmt . " AND city = '$2'";
} elseif(isset($_POST["COUNTRY"])) {
   $stmt2 = $stmt . " AND country = '$2'";
}

if(isset($stmt3)) {
   $result = pg_prepare("myconnection", "my query", $stmt3);
   $result1 = pg_execute("myconnection","my query", array("0000","someCity","someCountry"));
} elseif(isset($stmt2)) {
   $result = pg_prepare("myconnection", "my query", $stmt2);
   $result1 = pg_execute("myconnection","my query", array("0000","someCountry"));
} elseif(isset($stmt1)) {
   $result = pg_prepare("myconnection", "my query", $stmt1);
   $result1 = pg_execute("myconnection","my query", array("0000","someCity"));
} else {
   $result = pg_prepare("myconnection", "my query", $stmt);
   $result1 = pg_execute("myconnection","my query", array("0000"));
}

我省略了(就像你所做的那样)都为简洁的错误检查。



Answer 3:

虽然丹尼尔和艾默里克都是正确的 - 在测试两次,也没有使用数字没有任何意义。 见下文:

$some_vars = array();
$some_vars[":zip"] = $_POST["ZIP"];
$stmt = "SELECT * FROM customer WHERE zip = :zip";

if(isset($_POST["CITY"])){ 
    $some_vars[":city"] = $_POST["CITY"]);
    $stmt .= " AND city = :city";
}

if(isset($_POST["COUNTRY"])){ 
    $some_vars[":country"] = $_POST["COUNTRY"]);
    $stmt .= " AND country = :country";
}

$result = pg_prepare("myconnection", "my query", $stmt);
$result1 = pg_execute("myconnection","my query", $some_vars);

不要忘了消毒和这样的。



Answer 4:

不要做字符串连接。 检查参数设置。 如果不将它们设置为空。 使用一个单一的查询字符串:

$zip = $_POST["zip"];
$city = $_POST["city"];
$country = $_POST["country"];

if (!isset($zip)) $zip = '';
if (!isset($city)) $city = '';
if (!isset($country)) $country = '';

$stmt = "
    select *
    from customer
    where
        (zip = '$1' or '$1' = '')
        and
        (city = '$2' or '$2' = '')
        and
        (country = '$3' or '$3' = '')
";

$result = pg_prepare("myconnection", "my query", $stmt);
$result1 = pg_execute(
        "myconnection",
        "my query",
        array($zip, $city, $country)
        );

如果相应的参数不是空字符串每个条件才会被执行。

同样的逻辑也可以使用空值的空代替那些列包含应选择空字符串。



文章来源: How to make dynamic postgres prepared statements in PHP