编辑:此问题已解决。这是查询错误的模式名称的简单情况。其余代码可以工作(即使它不是很好的编码实践)。
这里也问了同样的问题:
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;
答案 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
答案 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
”也是一个容易犯的错误。)