- 締切済み
phpのif文について
下記の表現をした際に、必ずif文がelseの方に流れてしまいます。 そこで条件式をいろいろ書き換え試したところ、 if($_SESSION['user_id'] = $employee_id) ↓ if($_SESSION['user_id'] == $employee_id) に書き換えた際にだけ、elseに流れず、 ==の関係が成り立ちます。 その際に変更しているのは、条件式だけで他のコードを変更していません。 どのように変更すれば、正しく条件式が機能しますか? <?php $sql = "SELECT * FROM thread_detail WHERE thread_id = $id"; $date = mysql_query($sql,$link); $logs = array(); while ($post = mysql_fetch_assoc($date)) { $logs[] = array($post['thread_detail_id'], $post['parent_thread_detail'], '<a href="thread.php?id='.$post['thread_id'].'&res='.$post['thread_detail_id'].'">'.$post['post_date'],$post['employee_id'].'</a>', $post['body'],'<a href="thread.php?id='.$post['thread_id'].'&edit='.$post['thread_detail_id'].'">編集</a>', '<a href="remove_thread.php?id='.$post['thread_id'].'&delete='.$post['thread_detail_id'].'"'.'onclick="return confirm(\'本当に削除しますか?\');">削除</a>'); } foreach ($logs as list($no, $oya, $create_date, $employee_id, $kiji, $edit, $delete)) { if ($oya > 0) { continue; } if($_SESSION['user_id'] == $employee_id) { print $create_date. $employee_id .'<br>'. $kiji . $edit . $delete . '<br>'; } else { print $create_date. $employee_id .'<br>'. $kiji . '<br>'; } listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $create_date, $employee_id, $kiji, $edit, $delete)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<ul>'; } if($_SESSION['user_id'] == $employee_id) { print '<li>' .$create_date.$employee_id.'<br>'. $kiji . $edit . $delete . '<br>'.'<br>' . '</li>'; } else { print '<li>' .$create_date.$employee_id.'<br>'. $kiji . '<br>'.'<br>' . '</li>'; } listchild($logs, $no); } if ($ct > 0) { print '</ul>'; } } ?>
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- agunuz
- ベストアンサー率65% (288/438)
>どのように変更すれば、正しく条件式が機能しますか? http://www.php.net//manual/ja/language.operators.comparison.php http://www.php.net//manual/ja/types.comparisons.php if の条件が比較演算でなく代入式の場合は「代入する値」が条件になります。 <?php if ($var = false) { print 'true<br>'; } else { print 'false<br>'; } if ($var = true) { print 'true<br>'; } else { print 'false<br>'; } >if($_SESSION['user_id'] = $employee_id) これで「else が実行される」のであれば、$employee_idの値が false と判断される値( 0 など)だと推測されます。また比較演算に書き直したら true になるということは $_SESSION['user_id'] もどうかなとは思います(未定義だったりはしないんでしょうねぇ・・・)。 いずれにしても、$_SESSION['user_id'] や $employee_id をvar_dumpして内容を確認するのが先です。それを確認しないでソースを書き直しても無駄です。 (蛇足) ネイティブなMySQL関数はすでに非推奨です。PDOで書き直すことを強くお勧めします。 http://www.php.net/manual/ja/mysqlinfo.api.choosing.php
- hitomura
- ベストアンサー率48% (325/664)
……if 文の中に = が一つだけの「判定」をやっているところがありませんが? まあおそらく間違って if 文がきいてるソースをペーストしてしまったのでしょう。 それはともかく、PHP では = 一つだけを書いた場合は(それが文字列の内部でない限り)つねに左辺と右辺の比較ではなく左辺への右辺の値の代入を行います。 http://www.php.net/manual/ja/language.operators.assignment.php 左辺と右辺が等しいかどうかを得たいならば === か == を使用してください。 http://www.php.net/manual/ja/language.operators.comparison.php なお、代入を行っている方の if 文がなぜエラーとならなかったというと、PHP では TRUE/FALSE 以外の値を TRUE/FALSE であると読み替えて if の判定を行います。 http://www.php.net/manual/ja/language.types.boolean.php#language.types.boolean.casting 今回の場合は、代入の結果をもとに判定して、その読み替え結果が TRUE だったのでしょう。