我有一个用户表单,用于设置单个记录“当前”。一次只能将一个记录设置为当前记录。因此,我向用户显示一个下拉列表,他们选择要设置当前的项目并在表单底部点击“更新”。
PHP / Mysqli需要进入并将所有记录列“current”设置为0,然后将表单中的值更新为值“1”。
最初,我只是简单地计算行数,如果循环计数器=行的id,则运行一堆查询将列更新为0或1。嗯...当我开始对其他部分进行测试并且索引编号高于总行数时,这很快就破裂了。是的,最初是愚蠢的做法!
以下是我尝试使用PHP / MySQL代码的内容:
// $link is the database link defined elsewhere. This does work as I use it all over the place
$setCurrent = X; // This is the number passed from my form
$init_query = "SELECT id, current FROM myTable";
if ($stmt = $link->$prepare($init_query) {
$stmt->execute() or die ($stmt->error);
$stmt ->bind_result($id, $current)
while ($stmt->fetch()){
if ($id == $setCurrent){
$update_sql = "UPDATE myTable SET current ='1' WHERE id='".$setCurrent."'";
$stmt2 = $link->prepare($update_sql);
$stmt2->execute;
}
else {
$update_sql = "UPDATE myTable SET current ='0' WHERE id='".$id."'";
$stmt2 = $link->prepare($update_sql);
$stmt2->execute;
}
$stmt->close();
这失败并给我一个致命错误:未捕获错误:调用成员函数执行boolean in .....
我正在绞尽脑汁,无法弄清楚到底发生了什么。我在PHP / MySql工作了几年,这是我第一次进入OO Mysqli。请温柔:)
答案 0 :(得分:1)
你缺少两个闭合花括号。一个用于第一个if()
,另一个用于while()
答案 1 :(得分:1)
为什么他们一次一个?您可以在一个查询中执行此操作
$setCurrent = X;
$query = 'UPDATE myTable
SET `current` = (id = :current)';
$stmt = $link->prepare($query);
$stmt->bindValue(':current', $setCurrent);
$stmt->execute();
(并且误用了如果id等于$ setCurrent,则()之间的部分解析为true,即1。)
一些解释:
SELECT 10=10;
会给出一种“真实”。但是由于Mysql没有给出真实,它给出了1。
同样的:
SELECT 10=20;
这是假的,所以给你0。
现在回到您的查询:您希望为所有id不等于某个数字的记录获取值0。并且你想要1当相等: 所以你必须将列id的值与$ setCurrent进行比较。当它们匹配时你得到1然后你将1放入“当前”列 当它们不匹配时,所有其他情况,那么你得到一个0,那个0进入列Current。
是的,这也可以这样做:
UPDATE mytable
SET `current` = CASE id
WHEN $setCurrent THEN 1
ELSE 0
END CASE
或使用IF, 但是他们的其他语法更短
修改强> 列名称周围需要反对,因为当前是保留字