Coldfusion-cfqueryが正しいデータを返さない[終了]
-
03-07-2019 - |
質問
cfqueryをコードで実行すると、3行を返す必要があるときに1行しか返されない理由を理解するのに苦労しています。
ほとんどすべての場合、このcfqueryは正しいデータを返しています。 1人または2人のユーザーの場合、cfqueryは1行のみを返します(3行のうち)。 coldfusionが吐き出すデバッグ情報から出力を取得し、そのクエリをヒキガエルで実行すると、正しい結果が表示されます。
cfqueryとtoadの結果が異なる原因は何ですか?私が返す列の1つはユーザー定義であり、おそらく結果が返されない原因となるいくつかの特殊文字が列に含まれていますか?私は本当に困惑しており、ここの周りの誰も私がこれについて考えるのを助けるために冷たい融合を知っていません。それで私はSOに目を向けます。
私が話している間、ウェブ上で検索しています。
追加:
<cfquery name="getInfo" datasource="#DSN#">
SELECT
u.user_no, u.username, u.description
FROM
user_info u
WHERE
u.parent = #session.user_no#
ORDER BY
u.username ASC
</cfquery>
繰り返しますが、数人のユーザーのうち1人は3行のうち1行を返し、残りはすべて正しい結果を返すようです。
****更新**** 誰も気にしないが、ちょうど今日、この問題は解決された!あなたがそれが何であったか知りたいならば、私はあなたに話します。
このコードをテストしているテスター(キャッシュをクリアしていると主張している!)が、キャッシュをクリアしなかった!彼女は私にいくつかのB.Sを与えていたときにそれを修正しようとして走り回っていました私が彼女にそれがありそうな問題だと言った後。まあ、私はそれにあまり時間を費やしませんでした。 cfqueryparamについての回答に感謝します。これから、コールドフュージョンコーディングでそれらを使用します。
乾杯!
解決
クエリの変数の周りでは常に cfqueryparam
を使用してください!
今、これで問題はなくなりました。そのコードには、3行のうち1行のみが返されるようなものは何もありません。
つまり、問題はデータに関連するか、コード内のどこかにあります。
そのクエリの直後に する場合:
<cfdump var="#getInfo#"/><cfabort/>
1行または3行取得しますか?
-
1行の場合、これはデータの問題を示唆しています-非ASCII「特殊」文字が原因になるとは思いませんが、整数を返すだけでテストできます-または
SELECT 1 .. 。
-3つの行がある場合、3つの1が得られます。 -
3行ある場合、問題を引き起こしているのは後のコードである必要があるため、次に何が起こっているのかを知る必要があります。
理にかなっていますか
他のヒント
cfqueryparamを使用して、クエリに入力する変数のタイプを定義します。
データベースクエリで具体的になりすぎることは決してありません。整数が文字列として評価されるため、誤った結果セットが返されるという問題に遭遇しました。
(追加された(メイン)ボーナス-cfqueryparamは、SQLインジェクション攻撃に対する追加の保護に常に適しています)
データまたは入力にエラーがあると仮定します(SESSION timed out / invalid?)。
実は、DBサーバーがコンソールで表示する内容とは異なる&lt; cfquery&gt;
の結果を決して見たことはありません。あり得ないことなので、私はそれを可能性とは考えません。
次のテストシナリオをお勧めします。
<cfquery name="AllUsers" datasource="#DSN#>
SELECT
p.user_no,
COUNT(u.user_no) ChildCount
FROM
user_info p
LEFT JOIN user_info u ON p.user_no = u.parent
GROUP BY
p.user_no
ORDER BY
COUNT(u.user_no)
</cfquery>
<cfdump var="#AllUsers#">
そこには、各ユーザーの子供数が正確に表示されます。
より安全に感じる場合は、ループを実行して結果を個別に確認できます。
<cfloop query="AllUsers">
<cfquery name="SingleUser" datasource="#DSN#">
SELECT
u.user_no, u.username, u.description
FROM
user_info u
WHERE
u.parent = #AllUsers.user_no#
</cfquery>
<cfif SingleUser.RecordCount neq AllUsers.ChildCount>
<cfabort showerror="space-time rupture found for user #AllUsers.user_no#">
</cfif>
</cfloop>
&lt; cfabort&gt;
がヒットすることはないと思います。これは、&lt; cfquery&gt;
が問題なく機能していたことを証明するものです。他のどこかに。