PHPを使用した2番目の句または解析結果を追加しますか? -- php フィールド と mysql フィールド と where フィールド 関連 問題

Add 2nd WHERE clause or parse results with PHP?












0
vote

問題

日本語

マイコードはレポートの詳細を引いていますが、その特定のレポートが表示しようとしているユーザーに関連付けられている場合には、詳細が表示されているだけです。 Queryに2番目の WHERE 句を追加するか、またはPHPを使用して関連付けられているユーザーIDを確認する場合は、より効率的であるかどうか疑問に思いますか。管理者にすべてのレコードへのアクセスが簡単になりますので、後者を好むでしょう。

<事前> <コード> <?php $query = mysql_query("SELECT report_id, report_user, report_text FROM reports WHERE report_id = '$rid' AND report_user = '$uid'"); $report = mysql_fetch_assoc($query); ?>

または

<事前> <コード> <?php $query = mysql_query("SELECT report_id, report_user, report_text FROM reports WHERE report_id = '$rid'"); $report = mysql_fetch_assoc($query); if ($report['user'] !== $uid) { // Access Denied } ?>

事前にありがとう! ビリー

英語

My code pulls the details of a report, but I only want the details displayed if that particular report is associated to the user attempting to view it. I'm wondering if it's more efficient/proper to add a second WHERE clause to the query or if I should just use PHP to check the associated user id? I would prefer the latter since it would be easier to give the administrators access to all records.

<?php $query = mysql_query("SELECT report_id, report_user, report_text                         FROM reports                         WHERE report_id = '$rid'                         AND report_user = '$uid'");  $report = mysql_fetch_assoc($query); ?> 

OR

<?php $query = mysql_query("SELECT report_id, report_user, report_text                         FROM reports                         WHERE report_id = '$rid'");  $report = mysql_fetch_assoc($query); if ($report['user'] !== $uid) {     // Access Denied } ?> 

Thanks in advance! Billy

</div
        
 
 

回答リスト

5
 
vote
vote
ベストアンサー
 

クエリオプションの内側のフィルタリングで行くべきだと主張します。 PHPコードにいくつかのバグがある場合は、より効率的で、ユーザーのプライバシーをよりよく保護します。レポートを表示する管理機能については、照会を動的に作ることができます。

<事前> <コード> UserInput0

あなたが変数を拘束することを確認してください。

 

I would argue that you should go with filtering inside the query option. It is more efficient and would protect user privacy better in case you have some bugs in your php code. Regarding the admin ability to view reports, you can craft the query dynamically.

$sql = "SELECT report_id, report_user, report_text                         FROM reports                         WHERE report_id = ?"; if($userContext) {      $sql .= " AND report_user = ?";     $stmt = $mysqli->prepare($sql);     $stmt->bind_param('dd', $rid, $uid); } else //admin context {     $stmt = $mysqli->prepare($sql);     $stmt->bind_param('d', $rid); } 

What ever you do make sure to bind you variables.

</div
 
 
0
 
vote

管理者がログインしているかどうかについては、最初のクエリを動的にすることです。このようなもの:

<事前> <コード> query = ".." if (user != admin) query .= " AND report_user = " . intval(user_id)
 

The best way would be to make the first query dynamic, in regards to if an admin is logged in or not. Something like this:

query = ".."  if (user != admin)     query .= " AND report_user = " . intval(user_id) 
</div
 
 
0
 
vote

テーブルが正しく索引付けされていると仮定すると、パフォーマンスの違いは最小限です。 PHPロジックに依存しないため、SQLアプローチはエラーが発生しやすいと主張する可能性があります。その一方で、2番目のアプローチを使用する場合は、ユーザーに意味のあるエラーメッセージをユーザーに提供しやすく、表示するレポートがない理由を正確に判断できます。最初のアプローチでは、レポートが存在しないか、ユーザーがそれを表示することを許可されていない場合はわかりません。ただし、最初のものに行きます。

また、PDOの使用を検討する必要があります。おそらくあなたはその例のためにあなたがしたテクニックを使っただけですが、ただ言っているだけです。

 

Assuming that your table is properly indexed, the difference in performance is minimal. One could argue that the SQL approach is less error prone as it does not depend on your PHP logic. On the other hand, it is easier to give users a meaningful error message if you use the second approach, because it is then possible to determine exactly why there is no report to display. In the first approach, you do not know whether the report does not exist or if the user is just not allowed to view it. I would, however, go for the first one.

Also, you should consider using PDO. Perhaps you just used the technique you did for the sake of the example, but just saying.

</div
 
 
 
 

関連する質問

0  SetContent /日付の選択  ( Setcontent selecting on dates ) 
ボルトのドキュメント あなたがいくつかの「ショートカット」を使うことができるもの 過去または将来の日付を持つレコードを選択する。そして「内部的に」 Boltはこれにstrtotime()機能を使用しているので、そのマニュアルを参照してください。 ...

1  ScalaQueryを使用して日付でクエリを制限する方法  ( How can i limit my query by date using scalaquery ) 
ScalaQueryを使用していて、日付フィールドに基づいてクエリを制限しようとしたときに問題に遭遇しました。 Scala 2.9.2を使用している、ScalaQuery 2.9.1:0.10.0-M1以下のコードを考慮してください。 <事前> <コード> ...

0  SQLクエリのパフォーマンスがやや奇妙な句  ( Sql query performance using somewhat strange where clause ) 
あなたのために面白い質問をしました、そこにSQL Gurusがそこに(または範囲内容?)。 実行時にクエリを構築する必要があるとき、私はこの習慣を得ました。複数の「IF」チェックを回避するために、私はただ行って「真の違い」を書いてください。その後、残りはフォー...

0  WHERE句のインデックスを使用しないでください  ( Not using index in where clause ) 
WHERE句に次の場合: <事前> <コード> ( approps_precio * moneda_valor BETWEEN 2000 AND 6000) idx_approps_precioインデックスを使用しません。 しかし <事前> <コード>...

0  whereのinsertを使う方法  ( How to use insert with where ) 
データベース内の別の表のフィールドがtrueまたはfalse(bool)かによって、MySQLデータベースにデータを挿入する必要があります。私がこれまでのところ、私がこれまでのところに何か行く: <事前> <コード> //Insert data into da...

-1  MySQLはいくつかと演算子を使って選択します  ( Mysql select with some and operator ) 
このテーブルを持っていて、私は以下の結果を得たい <事前> <コード> prod_feat_val Table: **id** **prod_id** **feat_id** **value** 1 34 ...

0  Rails Array属性に他の配列との重複が含まれている場合のクエリ  ( Rails query where array attribute contains overlap with other array ) 
私はアパートのサブレットのリストを表すリストと呼ばれるモデルを持っています。これらのサブレットは、さまざまな用語(夏、冬など)のために貸し出すことができます。そのため、各サブレットの用語はシリアル化された文字列として格納されます。 (私はこれが最善ではないこと...

2  マスクに基づくグローバルアレイのサブセットのNumpy生成  ( Numpy generation of subsets of global array based on mask ) 
私は、特定の軸に対して、Numpyを使用して一致するブールマスクに基づいて、グローバル2DアレイからのNP.Arraysのリスト(またはnp.Array)を生成することに関心があります。 NP.MA.MASK()または類似のものが採用されているかどうか疑問に思...

0  参加なしのMySQL文  ( Mysql statement without a join ) 
私は記事を照会しようとしています、そして私は他のテーブルへの結合をしたくない。 行: <事前> <コード> article_id doc_type doc_type_id 1 1 2 1 2 ...

0  〜400.000エントリでのMySQLクエリを遅くします  ( Slow mysql query on 400 000 entries ) 
私は本当に遅い次のクエリを持っています(2.9 seg): <事前> <コード> SELECT post_id FROM ap_props LEFT JOIN ap_moneda ON ( ap_props.rela_moneda...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有