2017-12-02 17 views
0

私はforeachやwhileのようなPHPループでは本当に悪いので、私は助けを求める。PDO SELECTとUPDATEループ

私はループにこのコードが必要になります。

$loser = $pdo->prepare("SELECT `user` FROM `contest` WHERE `winner`= '0'"); 
$loser->execute(); 

$balance = $pdo->prepare("SELECT `balance` FROM `users` WHERE `login` = '$loser'"); 
$balance->execute(); 

$new_balance = $balance + 100; 

$back = $pdo->prepare("UPDATE `users` SET `balance`= '$new_balance' WHERE `login`= '$loser'"); 
$back->execute(); 

$returned = $pdo->prepare("UPDATE `contest` SET `returned`= '1' WHERE `login`= '$loser'"); 
$returned->execute(); 

私は物事のカップルを試してみましたが、ここの周りに同様の質問を探したが、私は残念ながら解決策を考え出すことができませんでした。誰か助けてもらえますか?

+0

あなたの後に役立つループの種類の説明。 –

+0

私が必要とするのは、 'contest'行ごとに行を調べ、各行に対してこのコードを実行することです。 – Dosyk

+0

テーブルスキーマといくつかのデータを質問に追加できますか? – RamRaider

答えて

0

あなたにみんなありがとう。私は解決策を見つけました:

$stmt = $pdo->prepare('SELECT * from contest WHERE winner=0'); 
$stmt -> execute(); 
while($row = $stmt->fetch()) { 

$result_b = $pdo->prepare("SELECT `balance` FROM `users` WHERE `login` = '$row[user]'"); 

$result_b->execute(); 

$balance = $result_b->fetchColumn(); 

$new_balance = $balance + 100; 

$back = $pdo->prepare("UPDATE `users` SET `balance` = '$new_balance' WHERE `login` = '$row[user]'"); 
$back->execute(); 

$returned = $pdo->prepare("UPDATE `contest` SET `returned` = '1'"); 
$returned->execute(); 
} 
0

私は以下のコードはおそらく必要以上のものですが、データベースの強力な機能を有効に活用し、PHPコード内の不規則なループや迷子の変数を節約します。

以下は、ficticiousデータベーステーブルとデータを使用して部分的にテストされています。 データベース内でcursorを使用するデータベース内のstored procedureを使用して、最初のレコードセットを反復処理し、更新計算を実行します。 PHPで

mysql> describe balance; 
+---------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| balance | float unsigned | NO |  | 0  |    | 
| login | varchar(50)  | NO | MUL | 0  |    | 
+---------+------------------+------+-----+---------+----------------+ 

mysql> describe contest; 
+----------+---------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+---------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| returned | tinyint(3) unsigned | NO | MUL | 0  |    | 
| login | varchar(50)   | NO | MUL | 0  |    | 
| winner | int(10) unsigned | NO | MUL | 0  |    | 
| user  | varchar(50)   | YES |  | NULL |    | 
+----------+---------------------+------+-----+---------+----------------+ 

mysql> describe users; 
+---------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+------------------+------+-----+---------+----------------+ 
| id  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| balance | float   | YES |  | NULL |    | 
| login | varchar(50)  | YES |  | NULL |    | 
+---------+------------------+------+-----+---------+----------------+ 






mysql> select * from balance; 
+----+---------+-------+ 
| id | balance | login | 
+----+---------+-------+ 
| 1 |  0 | rita | 
| 2 |  0 | sue | 
| 3 |  0 | bob | 
+----+---------+-------+ 

mysql> select * from contest; 
+----+----------+-------+--------+------+ 
| id | returned | login | winner | user | 
+----+----------+-------+--------+------+ 
| 1 |  0 | rita |  0 | rita | 
| 2 |  0 | sue |  0 | sue | 
| 3 |  0 | bob |  1 | bob | 
+----+----------+-------+--------+------+ 

mysql> select * from users; 
+----+---------+-------+ 
| id | balance | login | 
+----+---------+-------+ 
| 1 |  0 | bob | 
| 2 |  0 | rita | 
| 3 |  0 | sue | 
+----+---------+-------+ 


/* calling the stored procedure ~ this will be done in PHP */ 
mysql> call `spUpdateContest`(100); 
+----------+ 
| result | 
+----------+ 
| finished | 
+----------+ 
1 row in set (0.01 sec) 




mysql> select * from users; 
+----+---------+-------+ 
| id | balance | login | 
+----+---------+-------+ 
| 1 |  0 | bob | 
| 2 |  100 | rita | 
| 3 |  100 | sue | 
+----+---------+-------+ 
3 rows in set (0.00 sec) 




create definer=`root`@`localhost` procedure `spUpdateContest`(
    in `p_addition` int 
) 
language sql 
not deterministic 
contains sql 
sql security definer 
comment '' 

proc:begin 

    declare done int default false; 
    declare _addition int default 0; 
    declare _balance integer default 0; 
    declare _loser varchar(50); 
    declare _cursor cursor for select `user` from `contest` where `winner`= '0'; 

    declare continue handler for not found set done=true; 

    set @_addition=cast(p_addition as unsigned); 


    open _cursor; 
    repeat 
    fetch _cursor into _loser; 


    if not done then 

     select `balance` into @_balance from `users` where `login` = _loser; 
     update `users` set `balance`= @_balance + @_addition where `login`= _loser; 
     update `contest` set `returned`= '1' where `login` = _loser; 

    end if; 

    until done end repeat; 
    close _cursor; 

    set _balance=null; 
    set _loser=null; 
    set _addition=null; 
    set done=null; 

    select 'finished' as 'result'; 
end 

この本のように呼び出すことができます。

$sql='call `spUpdateContest`(100)'; 
+0

この回答をありがとうございました。 – Dosyk

+0

あなたは 'ストアドプロシージャ'を理解することができ、自分のデータベース用に実装できることを願っています。 – RamRaider

関連する問題