2017-07-09 16 views
3

私は、単一のレコードを "現在"に設定するユーザーフォームを持っています。一度に1つのレコードだけを現在のレコードに設定することはできません。したがって、ユーザーに単一のドロップダウンリストを提示し、現在設定したい項目を選択し、フォームの下部にある「UPDATE」を押します。クエリがすでに実行された後、mysqli/phpを使用してすべてのレコードを更新するにはどうすればよいですか?

PHP/Mysqliは、すべてのレコード列 "current"を値0に設定し、フォームから値を "1"に更新する必要があります。

最初は、単純に行数をカウントし、ループカウンタが行のIDの場合は列を0または1に更新する一連のクエリを実行しました。まあ...私は他の部分でテストを始めてインデックス番号が総行数よりも高くなったので、それは速やかに壊れました。はい、それを最初にやるのは愚かなやり方です!これが失敗したと私に致命的なエラーが発生します

// $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();

:ここ

は、私はPHP/MySQLのコードを実行しようとしました何不明なエラーは:ブール値で実行メンバ関数の呼び出し.....

私はこの上に私の頭脳を掛けていると、何が起こっているのか理解できません。私がPHP/MySqlで作業して以来、数年経っており、これはOO Mysqliへの私の最初の夢です。穏やかにしてください:)

+0

あなたのスクリプトが失敗した行について言えば便利かもしれません。どのクエリからエラーが出ますか? –

+0

これはおそらくprepare()の余分な$ですか? –

+0

私は別のシステムからコードを転記しました。構文は開発システム上で動作します。余分な$とcurleysはちょうど脂肪の運指です。 – user3723090

答えて

1

2つの中括弧がありません。最初の1つはif()、もう1つはwhile()

1

なぜ1つずつ行うのですか?あなたは1つのクエリー

$setCurrent = X; 
$query = 'UPDATE myTable 
      SET `current` = (id = :current)'; 
$stmt = $link->prepare($query); 
$stmt->bindValue(':current', $setCurrent); 
$stmt->execute(); 

でそれを行うことができます(そしてもしidが$ setCurrent、(間の部分に等しいという事実を悪用)1である、真の解決)

説明するいくつか:

SELECT 10=10;は、「TRUE」の種類を与えます。しかし、MySQLは真与えないように、それは1 を同じに与えるために行く:

SELECT 10=20;これは、あなたが戻ってあなたのクエリに今0

を与え、FALSEです:あなたは値0を取得したいですidがsome-numberと等しくないすべてのレコード。等しい場合は1を返します。 したがって、列IDの値を$ setCurrentと比較する必要があります。それらが一致すると1を取得し、現在の列に「1」を入れます。 それ以外の場合はすべて0となり、0がCurrentになります。

そして、はい、これも行うことができるよう:他の構文は、現在のように、

編集 backticsは、カラム名の前後に必要とされる方法短い

UPDATE mytable 
SET `current` = CASE id 
       WHEN $setCurrent THEN 1 
       ELSE 0 
       END CASE 

やIF、 しかし、彼らを使用して予約語です

+0

'とidが$ setCurrentと等しい場合、その間の部分が1になるという事実を悪用することができますか?) " – user3723090

+0

id、name、dateとなるようにテーブルが設定されています。 、現在の フォームはドロップダウンを提供し、ユーザは "名前"を見つけ、現在の私が望むものを見つけられますGo フォームハンドラは、その名前に関連付けられたIDを取得し、そのidの '現在の'列に関連付けられている行を1に設定し、次に他のすべての行を現在の列に「0」に設定します。 – user3723090

+0

@ user3723090上記の説明を追加しました –

関連する問題