SQL不能在php中删除

时间:2013-09-29 08:23:41

标签: php sql postgresql sql-delete

编辑:此问题已解决。这是查询错误的模式名称的简单情况。其余代码可以工作(即使它不是很好的编码实践)。

这里也问了同样的问题:

SQL statement not deleting in 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;

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用$mySearch作为实际参数和预准备语句的名称似乎有点奇怪,特别是因为您准备了3个不同的语句,而这些语句实际上并不是该变量的函数({{ 1}})但取决于$_POST['row']

由于您每次都重新定义这些语句,并为每个新参数添加一个新名称,因此您实际上并没有从重用中获得任何东西。如果您使用新参数进行搜索(从you can't re-use the same name in the same session, unless it's the empty string开始),这可能会导致问题。您也可以使用$_POST['tbl']代替。

如果你真的想要使用预准备语句,请为它们提供3个固定的不同名称(每个3个查询各一个):它是pg_query_params,它将在下一次使用不同的参数进行这些相同的查询。

如果您尝试在同一会话中使用相同名称重新定义它们,则可能会遇到这些预处理语句遇到的问题之一,具体取决于此处的代码。我在PHP中找不到pg_execute的{​​{1}}的绑定,但您可以使用pg_prepared_statements view来查看是否已有针对您在当前选择的名称的预准备语句会话,在使用libpq之前。

PQdescribePrepared的结果也应该是您应该检查错误的结果(它不是真正的声明,因为您使用的pg_prepare变量名似乎建议。)


编辑:

正如我在评论中所说(似乎导致了合适的解决方案),还值得检查pg_prepare是否为正确的模式名称。我对此感到有些惊讶,因为如果你是PostgreSQL的新用户,那么使用架构是很不寻常的(大多数人只会使用$stmt开头),但我想这可能来自其他人提供的现有数据。 (如果你来自MySQL背景,使用“lab2”也是一个容易犯的错误。)