-2

编辑:这已解决。这是一个查询错误模式名称的简单案例。其余代码有效(即使它不是很好的编码实践)。

在这里问了同样的问题:

SQL 语句未在 PHP 中删除

不过,我在该线程上没有看到可靠的解决方案。基本上我的问题是它说删除成功,但没有删除任何内容。我很确定它与删除语句中的 $1 有关,但我不知道还能尝试什么。有人可以向我解释为什么这不起作用吗?这是我的代码:

$mySearch = $_POST['row'];

if($_POST['tbl'] == "country"){
    $query = 'DELETE FROM lab2.country WHERE country.country_code = $1';
}
elseif($_POST['tbl'] == "city"){
    $query = 'DELETE FROM lab2.city WHERE city.id = $1';
 }
elseif($_POST['tbl'] == "language"){
    $query = 'DELETE FROM lab2.country_language WHERE country_language.country_code = $1';
}

$stmt = pg_prepare($conn, $mySearch, $query); //prepare statement
$result = pg_execute($conn, $mySearch, array($mySearch)); //execute

if(!$result){ //error if no value in $result
    die("Unable to execute: " . pg_last_error($conn));
} else{
       //results are good so output them to HTML
    echo "Delete was successful <br />";
    echo "Return to <a href=\"" . $_SERVER['HTTP_REFERER'] . "\">search page</a>";
}
pg_free_result($result);
    pg_close($conn);
return;
4

2 回答 2

2

根据 中的文档pg_prepare您必须将名称作为第二个参数来提供准备好的语句。每个连接必须是唯一的。如果指定了“”,则创建一个未命名语句,覆盖任何先前定义的未命名语句。第二pg_execute个参数是准备语句的名称。

这个:

$stmt = pg_prepare($conn, $mySearch, $query); //prepare statement
$result = pg_execute($conn, $mySearch, array($mySearch)); //execute

应该:

$result = pg_prepare($conn, "my_query", $query); //prepare statement
$result = pg_execute($conn, "my_query", array($mySearch)); //execute

pg_execute

于 2013-09-29T08:56:16.220 回答
1

将其用作实际参数和预准备语句的名称似乎有点奇怪$mySearch,特别是因为您正在准备 3 个不同的语句,它们实际上不是该变量 ( $_POST['row']) 的函数,而是依赖于该变量$_POST['tbl']

由于您每次都在重新定义这些语句,并为每个新参数使用一个新名称,因此您实际上并没有从重用中获得任何收益。如果您使用新参数进行搜索,这可能会导致问题(因为您不能在同一会话中重复使用相同的名称,除非它是空字符串)。你不妨pg_query_params改用。

如果您真的想使用准备好的语句,请给它们 3 个固定的不同名称(3 个查询中的每一个):它pg_execute会在接下来的时间为这些相同的查询使用不同的参数。

根据围绕此的代码,您可能会遇到这些准备好的语句的问题之一是,如果您尝试在同一会话中使用相同的名称再次重新定义它们。我在 PHP中找不到libpq' 的绑定PQdescribePrepared,但您可以在使用.pg_prepared_statementspg_prepare

的结果pg_prepare也应该是您应该检查错误的结果(这不是一个真正的语句,因为$stmt您使用的变量名似乎暗示了这一点)。


编辑:

正如我在评论中所说(这似乎导致了合适的解决方案),同样值得检查的lab2是正确的模式名称。我对此感到有点惊讶,因为如果您是 PostgreSQL 新手(大多数人刚public开始使用),使用模式是不寻常的,但我想这可能来自其他人提供的现有数据。(如果您有 MySQL 背景,使用“ database_name.table_name”也很容易犯错误。)

于 2013-09-30T00:58:36.100 回答