0

バックグラウンド:

あるテーブルから情報を取得し、それが 2 番目のテーブルに存在するかどうかを確認し、存在しない場合は情報を挿入するメソッドを作成しています。データを比較する際、チェックではまず名前が一致するかどうかを確認し、次に口座番号が対応する名前と一致するかどうかを確認する必要があります。このコードには多くのコメントが付けられているため、段階的なプロセスに従うこともできます。stackexchange の達人がテーブルにもたらしてくれたすべての支援に大いに感謝しているので、しばらく頭を悩ませた後、私の問題をテーブルに持ち込んでいます。

一致する名前が存在するにもかかわらず、アカウント番号を確認しようとするとコードが壊れているようです。私の最高のスキルによると、すべてのコードは完全に機能するはずです。

all_validation_names の print_f と all_validation_accounts を見ればわかるように、最初に通過したステートメントの情報がチェック付きの配列に含まれています。

私の質問は次のとおりです。対応するキー ($check_account_number) を持つ配列に格納された varchar 変数を in_array に渡すことができないのはなぜですか。この関数は常に else を返します。変数は "1" ですが、$all_validation_accounts の対応するキーを使用しても見つかりません。

助けてください!

スクリプト処理のコード

        if (in_array($check_agency_name,$all_validation_names))
        { 

            //Set a marker for the key index on which row the name was found
            $array_key= array_search($check_agency_name, $all_validation_names);

            //Now check if the account corresponds to the right account name
            if (in_array($check_account_number,$all_validation_accounts["$array_key"]))
            //NOTE: i've even tried strict comparison using third parameter true    
            {
            //Bounce Them If the Account Matches with a name So theres no duplicate entry (works)
            }

            //If the account doesn't correspond to the right account name, enter the information
            else
            //ALSO DOESNT WORK: if (!(in_array($check_account_number,$all_validation_accounts["$array_key"])))
            {
            // The account doesn't exist for the name, so enter the information
            //CODE TO ENTER INFORMATION THEN BOUNCE (works)
            break;  
            }
        }

出力:

一致する名前を渡す: a およびアカウント:1

アカウントが存在するため、すべての検証配列を以下に示します: all_validation_names: Array ( [0] => a [1] => a [2] => b )

すべての検証アカウント: 配列 ( [0] => 1 [1] => 2 [2] => 2 )

システムは配列 all_validation_names で check_agency_name を見つけたので、次のキーで口座番号を確認してみましょう: 0

アカウント名は存在しましたが、システムはアカウント番号の一致を見つけられなかったため、アカウントが存在しないかのように入力する必要があります

入力する必要がある情報は次のとおりです: used_selector: 0 Agency_name:A address: city: state: zip: account_number: 1

システムは情報を入力し、クライアントをバウンスする必要があります

4

3 に答える 3

1

これは答えではありません。あなたのコードは冗長性に満ちており、非常に読みにくいです。SO に支援を求める前に、問題を絞り込むために、自分でさらに多くの作業を行う必要があります。特に、目に見えないデータベースのコピーがなければコードを実行することはできないため、コードをステップ実行するのに忍耐力がある人はほとんどいません。

__trim()ただし、関数の名前が不十分であり、機能に対して複雑すぎることをお伝えしなければならないと感じました。これは「トリマー」ではありません。実際のトリマーとは異なり、trim()文字列の「内側」と端から文字を削除するからです。そして、あなたの実装は非常に複雑です。

これは、次の 1 行の関数と同じです。

function __trim($str, $charlist=" \t\r\n\0\x0B") {
    return str_replace(str_split($charlist), '', $str);
}

その 40 行の__trim関数を見たら、質問のコードをこれ以上読む気がなくなりました。

アップデート

質問を絞り込みましたね。この時点で、プログラムの状態を推測してみます。(これはあなたが私たちのためにすべきだったことです....)

コードを最小限にスリム化:

if (in_array($check_agency_name, $all_validation_names)) { 
    $array_key = array_search($check_agency_name, $all_validation_names);
    if (in_array($check_account_number, $all_validation_accounts["$array_key"])) {
        error_log('IF-BRANCH');
    } else {
        error_log('ELSE-BRANCH');
        // break;  // Removed because it makes no sense here.
    }
}

これらの変数の値を見てみましょう:

$check_agency_name = 'a'
$all_validation_accounts = array(1, 2, 2);
$all_validation_names = array('a', 'a', 'b');
$array_key = "0";
$check_account_number = ???

あなたは私たちに何が何で$check_account_numberあるかを教えていません。しかし、私たちはまだ、少なくとも 1 つの間違った点を確認するのに十分な知識を持っています。次の行はすべて同じです (変数名を値に置き換えただけです)。

in_array($check_account_number, $all_validation_accounts["$array_key"])
in_array($check_account_number, $all_validation_accounts["0"])
in_array($check_account_number, $all_validation_accounts[0])
in_array($check_account_number, 1)

ここで、 の値に関係なく、2 番目の引数が配列ではない$check_account_numberため、が false を返すことがわかります。in_array()

(ちなみに、キー ルックアップ$all_validation_accounts[$array_key]を引用しないでください。より簡単です。引用は、意図をあいまいにする以外に何も達成しません。)

このコードでもエラーが発生しますWarning: in_array() expects parameter 2 to be array, integer given in /file/name.php on line ##。これにより、すぐに問題が指摘されます。エラー ログを確認していれば、問題を確認できたはずです。PHP エラー レポートを非常に高く設定し ( E_ALL | E_STRICT)、エラー ログを監視して、通常の実行中にプログラムがエラー出力を生成しないことを確認します。何かが表示された場合は、コードを修正してください。

于 2013-03-30T21:44:26.053 に答える
0

警告: これは質問に対する回答ではありません

ステロイドのトリムから始めましょう:

次のように、組み込みの php 関数を使用して最適化することをお勧めします。

function __trim($str, $charlist = '') {
     $result = '';
     /* list of forbidden chars to be trimmed */
     $forbidden_list = array(" ", "\t", "\r", "\n", "\0", "\x0B");

     if (empty($charlist)) {
         for ($i = 0; $i < strlen($str); $i++){ 
             if(!in_array($str[$i],$forbidden_list))$result .= $str[$i];
         }
     } else {           // else means in case if (condition) was not met
         for ($i = 0; $i < strlen($str); $i++) {
             if(strpos($charlist, $str[$i])===false)$result .= $str[$i]; 
         }
     }
     return ($result);
 }

儀式レクチャー

mysqlの使用を停止します。非推奨です。それを使うことは、トラブルを招くことを意味します。

于 2013-03-30T21:21:12.997 に答える
0

チェックの背後にあるロジックを再考することで、私自身の質問に答えました。
ご回答ありがとうございます。

ここに解決策へのリンクがあります。SOのすべての偉大な精神がそれに値するので、私はそれをオンラインで投稿して共有し、最適化しました!

https://stackoverflow.com/questions/15775444/entry-of-items-checking-sharing-optimization-from-post-form

于 2013-04-02T22:29:38.300 に答える