• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:while文について)

while文についての質問

このQ&Aのポイント
  • while文についての質問です。while文は重複値をチェックして値が同じであれば繰り返し処理を行うものであり、SISID重複チェックに使用されています。しかし、実装に自信がなく質問をいただきました。
  • 質問のコードを見ると、SISID生成とSISID重複チェックのメソッドが定義されています。SISID生成メソッドではセッションIDを返し、SISID重複チェックでは生成されたSISIDとDBから取得した値を比較して重複をチェックしています。
  • 重複チェックが行われている部分でwhile文が使われています。while文の中では、DBから取得した値と生成されたSISIDを比較し、重複があれば再度SISIDを生成してチェックを繰り返します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mizutaki
  • ベストアンサー率33% (111/333)
回答No.2

> while ($key = array_search($this->key, $tmp)) { > if ($key !== false) { > $this->key = sha1(uniqid(mt_rand() , true)); > } else { > break; > } whileはtrueの時のみループを実行しますので、 $tmpの中に該当する値が存在しなかった場合、ループ中の処理は行われません。 whileの中のifはなくても大丈夫ですよ。

dcx147
質問者

お礼

お返事ありがとうございます。 >whileはtrueの時のみループを実行しますので foreachやforはよく使うのですがwhileは使用する癖が全くなかったもので初めて知りました^^; おかげ様で無事に解決です。ありがとうございました^^

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • mizutaki
  • ベストアンサー率33% (111/333)
回答No.1

まずはじめに、 DBの負荷は関係ないですよ。 DBの負荷というものは、DBへのアクセス回数とか、SQLの内容や、DBに入っているデータの個数が関係してきますから while(list($val) = $tmp) これが違う。 1回目のループも2回目のループも$valには一番目の値しか入ってきませんので、即無限ループ そういう場合echoで取得してたり、foreachに頼るべき場所なんですが、 sisidがかぶっていた場合、また最初からループをやり直すということなので、 これは少し厳しい。 配列が一般的な配列なのであるのでしたら、 countで配列の中身の個数を取得して、forでループをする。 forのループの途中で被ってる値が見つかったら、forの現在位置をリセットしてあげれば、 やりたいことが出来ますよ。 ちなみにPHPの関数の中にはarray_searchという非常に便利な関数も存在しているので、 こちらを使ったほうが簡単かもしれないです

dcx147
質問者

補足

お返事ありがとうございます。やはり聞いてよかったです^^; というか冷静に考えると都度変更する値なのでセッションidを利用する理由も特になかったので 任意の乱数を用いる事にしました。 実行するには以下のような感じでしょうか?(抜粋) // DBで取得した値の配列 $tmp = array('値1', '値2', '値3'); // 乱数生成 $this->key = sha1(uniqid(mt_rand() , true)); while ($key = array_search($this->key, $tmp)) { if ($key !== false) { $this->key = sha1(uniqid(mt_rand() , true)); } else { break; }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • GOTO命令のようなことをPHPで

    PHP4とmySQLで、以下のことがしたいのですが ・数字3文字の乱数を生成する ・DBに同じ値がないかチェックする ・同じ値が既にDBにあったときは乱数を生成するところからやり直す ・なければDBに書き込んで処理終了 ※DBには オートインクリメントのID | 乱数 の2フィールドを使用 ※乱数はintではなくvarcharとして書き込む PHPにgoto命令がないので、スマートなやり方ご存知の方いらっしゃいましたら教えてください。 あと数字3文字の組み合わせなので、DBに値が1000個入っているとそれ以上書き込めないので処理の中止(exit)を行いたいのですが、どこで分岐したものか悩んでますので、併せてご指導いただければ幸いです。 $rand1 = (0,99); $rand2 = (0,99); $rand3 = (0,99); $abc = $rand1.$rand2.$rand3. $sql = //省略 $result = $sql; if($abc == $result){ //重複アリ:この中の処理をどうするとスマートなのか、、、} elseif{ //重複してないのでDBに書き込みます }

    • ベストアンサー
    • PHP
  • SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。

    SQL文の実行結果を変数で受けて、それを連想配列に格納したいです。 (カラム名を連想配列のキーにします。) また、値をHTMLエスケープ処理したいと考えています。 下記のソースを書いてみましたが、配列$all[]にうまく入りません。 $qresult = mysql_query($qstring); $all = array(); while (list ($key, $val) = mysql_fetch_assoc($qresult)){  $all[$key] = htmlentities($val, ENT_QUOTES,EUCJP); } また、3行目をeach(mysql_fetch_assoc($qresult))に変更してもみましたが、 「Variable passed to each() is not an array or object」エラーが出ます。 mysql_fetch_assocの戻り値は連想配列では無いのでしょうか。 $qresult = mysql_query($qstring); $all = array(); while ($rec = mysql_fetch_assoc($result)){  $all[] = $rec; } 上記だと問題なく取得出来るのですが。。。 何が悪いのでしょうか。

    • ベストアンサー
    • PHP
  • いろいろな処理をさせてSQL文を効率的に作りたい

    $_REQUEST['getA']、$_REQUEST['getB']、$_REQUEST['getC'] ・・・ とあり、 これらをMYSQLのSQL文に効率的に組み込んでいきたいです。 mysqlのデータと$_REQUESTのキー名と対応させた$lllを foreachでそれぞれをswitchで処理を分けて、 $qqqのSQL文に組み込んでいるつもりです。 よろしくお願いします。 $lll = array( "getA"=>"mysql_colum_name_A", "getB"=>"mysql_colum_name_B", "getC"=>"mysql_colum_name_C", "getD"=>"mysql_colum_name_D", "getE"=>"mysql_colum_name_E" ); foreach($lll as $key=>$val){ if(!isset($_REQUEST[$key]) or $_REQUEST[$key]==='') continue; switch($key){ case "getA": $ga = explode("+", $_REQUEST[$key]); $val_A = $val; break; case "getB": $gb = $_REQUEST[$key]; $val_B = $val; break; case "getC": $gc = $_REQUEST[$key]; $val_C = $val; break; case "getD": $gd = $_REQUEST[$key]; $val_D = $val; break; ~ 他のcaseが続く ~ } } $qqq =<<<__SSS__ SELECT * FROM table WHERE 1 AND ga0 <= val_A AND val_A < ga1 AND `colum_B` BETWEEN CURDATE() - INTERVAL gb YEAR AND CURDATE() - INTERVAL 1 DAY AND gc <= val_C AND gd <= val_D AND val_E IN(ge) ORDER BY field deskORasc LIMIT L1,L2; __SSS__; $sss = $ddd->prepare($qqq); $sss->execute(array( ':ga0'=>$ga[0], ':ga1'=>$ga[1], ':val_A'=>$val_A, ':gb'=>$gb, ':val_B'=>$val_B, ':gc'=>$gc, ':val_C'=>$val_C, ':gd'=>$gd, ':val_D'=>$val_D, ':ge'=>$ge, ':val_E'=>$val_E, ~いろいろなものが続く~ ':field'=>$field, ':deskORasc'=>$deskORasc, ':L1'=>0, ':L2'=>50 )); $rrr = $sss->fetchAll(PDO::FETCH_ASSOC);

    • ベストアンサー
    • PHP
  • VB SQL文について

    VB6.0(SP5) XP SQL Sever7.0を使用しています。 テーブルからSQLより以下の条件で抽出しようとしています がいいSQL文が浮かびません。 TableA ----------------------- | sDate | nNumber | ----------------------- | 20030301 | 200 | | 20030301 | 250 | | 20030302 | 220 | | 20030302 | 225 | | 20030303 | 230 | ----------------------- 上記の内容で、一度読み込んで、内部テーブルに格納 したとします。TableAにデータ6、7が追加後に再度、 TableAを読んだときにデータ6、7だけ抽出したいのです が、いい方法ありますか? TableA ----------------------- | sDate | nNumber | ----------------------- | 20030301 | 200 | 1 | 20030301 | 250 | 2 | 20030302 | 220 | 3 | 20030302 | 225 | 4 | 20030303 | 230 | 5 | 20030303 | 240 | 6  ← 抽出したいデータ | 20030304 | 100 | 7  ← 抽出したいデータ ----------------------- ルール sDate :重複することあるが昇順になっている。 nNumber:sDateをキーにすると重複しない。 sDate+nNumberでみると昇順になっている。 よろしくお願いします。

  • 文字の入り方について

    簡略化していますが、下記のようなプログラムを作成しました。 whileでループし、カウントをとって。 sql文を作成するプログラムです。 $i=0; $j=0; while(!feof($this->fp)){ if($i>=2){ $sql_insert .="INSERT INTO "; $sql_insert .= $sql_value[$i]; $sql_insert .=";"; } $this->num=$j-1; print("<BR>"); print($i); print($sql_insert); $i++;; } この場合、$iは2以上回らないはずなのですが、 print($sql_insertを出力すると、 INSERT INTO (値);INSERT INTO (何も値が入ってない); という結果になります。 if($i>=2)という場合は 2よりも大きい場合はこの処理内をとおるということですよね? 実際は$iは2までしか回っていないのに、何故$sql_insertは余計に表示されているのでしょうか?

    • ベストアンサー
    • PHP
  • While 二重ループ処理について

    Bashのシェルスクリプトでwhileを使いループの処理を行いたい。 現状以下のようにファイルAの中に値”1”とイコールの場合に$awkを表示しています。 これを値”1”部分へファイルBの中の値を順にチェックできるようにしたいのです。 while IFS="$LF" read $READ_R record; do IFS='; ' set -- $record for awk in $3; do if [ "$awk" == "1" ]; then for awk in $4; do echo "$awk" done fi done done < "$1" 初心者のため分かり難い質問かもしれませんがよろしくお願いします。

  • レコード一件ずつ処理判定をしたいのです。

    データベースの値を取得してきて 下記内容の処理を実施したいと考えています。 Do While rs.EOF = False    処理する内容:     レコード1件目とレコード2件目の値をチェックする。     レコード2件目とレコード3件目の値をチェックする。 rs.MoveNext Loop レコード一件ずつ処理の判定をしたいのです。 要は レコード内で重複する値があれば排除する分岐をしたいんですよね。

  • SQL文の質問です

    ------------------- |No|・・・|locate| ------------------- | 1|・・・| LA-01| ------------------- | 1|・・・| LA-02| ------------------- | 2|・・・| LA-01| ------------------- | 2|・・・| LA-01| ------------------- | 2|・・・| LA-02| ------------------- | 2|・・・| LA-03| ------------------- | 3|・・・| LA-03| ------------------- | 3|・・・| LA-03| ------------------- 上のように、運用上の問題で、キー項目が設定されていないDBが あり、その中の「locate」フィールドの値を更新しなくてはいけません。   旧 新 LA-01 → LA-02 LA-02 → LA-03 LA-03 → LA-01 「一旦、どれかをまったく別の値にUPDATEしたあと、  残り2つをUPDATEし、最初の1つを再度UPDATEする」 と考え実行してみたのですが、データの件数が多く、 UPDATE3回実行は処理時間がかかりすぎたため、 できれば、SQL1文で処理させたいのですが、 いい考えが浮かびません。 よい方法が無いか知恵をお貸しください。

  • Cookieが消える?

    こんにちは 自作のWebページを作成したのですが 画面遷移を繰り返しているとCookieが 消えることがあるのです。 こういうことってあるのでしょうか? 環境は以下の通りです。 OS:Win2000,XP Pro ブラウザ:IE 6.0 Cookie書込み:javascript setCookie("bbb","hammy") function setCookie(key, val, tmp) { tmp = key + "=" + escape(val) + "; "; tmp += "path=/aaa/;"; tmp += "expires=Tue, 31-Dec-2030 23:59:59; "; document.cookie = tmp; } Cookie読込み:javascript function getCookie(key, tmp1, tmp2, xx1, xx2, xx3) { tmp1 = " " + document.cookie + ";"; xx1 = xx2 = 0; len = tmp1.length; while (xx1 < len) { xx2 = tmp1.indexOf(";", xx1); tmp2 = tmp1.substring(xx1 + 1, xx2); xx3 = tmp2.indexOf("="); if (tmp2.substring(0, xx3) == key) { return(unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1))); } xx1 = xx2 + 1; } return(""); } Cookie削除 javascript delCookies("CCC") function delCookies(key) { tmp = key; tmp += "=;path=/aaa/;"; tmp += "expires=Thu,01-Jan-2000 00:00:01 GMT"; document.cookie = tmp; } 画面遷移 A画面でCookie書込み⇒B画面でCookie情報を読込み ⇒C画面でCookie情報を読込み 現象:C画面でCookieが読込めない。 備考:C画面では読込みの前に別のCookieを削除しています。 B画面ではCookieの有無をチェックしているだけです。 何か疑問に思えることがありましたら教えてください。

  • UPDATE文について

    昨日こちらで自分の間違ったSQL文をご指摘頂き 時間計算の処理は実装する事が出来たのですが その後の計算処理が終わった後、計算結果をDBに格納する処理で 再度躓いてしまったので、再度のご教授お願いします。 $sql = "SELECT SUM(ROUND(労働時間/100, 0)) + ROUND(SUM(MOD(労働時間,100)) / 60, 2) AS total     FROM 労働時間テーブル WHERE id = 'ログインしている人のID';"; $total_Time = pg_query($con, $sql); $total_Time = pg_fetch_result($total_Time, 0, 'total'); // 確認のため、表示 echo $total_Time; で値はきちんと表示されおります。 しかし、この後UPDATE文で $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; pg_query($con, $sql); と打ち試しましたが、echoの時に表示された値がDBに格納されません。(>_<) 試しに $sql = "UPDATE 労働時間テーブル SET 総労働時間 = '$total_Time' WHERE id = 'ログインしている人のID';"; の'$total_Time'をSELECT文に変更したりもしましたが、echoの時に 表示されていた値とは違う値がDBに格納されるようになってしまいました。 どのように解決したらよいか、悩んでおります。 そもそもの考え方から間違っているのでしょうか? ご教授の程、よろしくお願い致します。