0

背景:

我正在创建一种从一个表中提取信息的方法,检查它是否存在于第二个表中,如果不存在则插入信息。在比较数据时,首先要检查姓名是否匹配,然后再检查帐号是否与对应的姓名相符。此代码有大量注释,因此也可以遵循逐步过程。我非常感谢 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()它从字符串的“内部”以及末端删除字符。而且你的实现太复杂了。

它与这个单行函数相同:

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。然而,我们仍然知道足以看到至少一件事是错误的。以下行都是相同的(只是用值替换变量名):

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)

在这里我们看到,无论 , 的值如何$check_account_numberin_array()都会返回 false,因为它的第二个参数不是数组

(顺便说一句,不要引用键查找:$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 回答