如何在查询执行后使用mysqli / php更新所有记录?

时间:2017-07-09 02:45:15

标签: php mysqli

我有一个用户表单,用于设置单个记录“当前”。一次只能将一个记录设置为当前记录。因此,我向用户显示一个下拉列表,他们选择要设置当前的项目并在表单底部点击“更新”。

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。请温柔:)

2 个答案:

答案 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, 但是他们的其他语法更短

修改 列名称周围需要反对,因为当前是保留字