【问题标题】:Issue with two stage in_array checking, wont allow second statement to be processed两阶段 in_array 检查问题,不允许处理第二条语句
【发布时间】:2013-03-30 20:59:33
【问题描述】:

背景:

我正在创建一种从一个表中提取信息的方法,检查它是否存在于第二个表中,如果不存在则插入信息。在比较数据时,首先要检查姓名是否匹配,然后再检查帐号是否与对应的姓名相符。此代码有大量注释,因此也可以遵循逐步过程。我非常感谢 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:数组( [0] => 一个 [1] => 一个 [2] => b )

所有验证帐户:数组 ( [0] => 1 [1] => 2 [2] => 2 )

系统在数组 all_validation_names 中找到 check_agency_name, 所以让我们用这个键检查帐号:0

账户名存在,但系统没有找到该账户 号码匹配,所以它必须输入它,就像该帐户从未存在过一样

这里应该输入的信息:used_selector: 0 机构名称:地址:城市:州:邮编:帐号:1

现在系统应该输入信息,并将客户端弹回

【问题讨论】:

  • 请以问题的形式重新表述您的问题。一个小的、独立的可运行示例也不会受到影响。
  • 改写了问题行,但不幸的是我不熟悉摆弄 mysql 输出的方法。因此输出数组的输出以引用表的输出......(在输出中:第一个字段是从第一个表中提取的字段,而 print_f 语句是指从第二个语句中提取的信息)跨度>
  • 我仍然没有看到任何以问号结尾的句子...
  • ...它在第二段大声笑...。还有其他人在寻找问题时遇到问题吗?一点也不粗鲁,但我不熟悉所有问题都必须跟一个问号。 X-D
  • 请说出您的确切问题。并尝试缩小您认为会生成错误的代码范围。代码是错误的,至少充满了冗余,形成了大量的意大利面条。往下看答案,看看我为什么这么说。注意这不是问题的答案..

标签: php mysql arrays scope


【解决方案1】:

这不是答案。您的代码充满了冗余,并且极难阅读。在向 SO 寻求帮助之前,您需要自己做更多的工作来缩小问题的范围。不太可能有人会耐心地单步执行您的代码,尤其是因为如果没有您的不可见数据库的副本,他们也无法运行它。

但是,我有义务告诉您,您的 __trim() 函数名称不正确并且对于它的作用来说太复杂了。它不是“修剪器”,因为与真正的trim() 不同,它会从字符串的“内部”以及结尾删除字符。而且你的实现太复杂了。

和这个单行函数一样:

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

当我看到那四十行的__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_number 的值如何,in_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),注意您的错误日志,并确保您的程序在正常运行时不会产生任何错误输出。如果您看到任何内容,请修复您的代码。

【讨论】:

  • +1 我完全同意:D。哦,顺便说一句,修剪要么用空格修剪,要么用备用字符表修剪。由于编码风格,这并不明显......“一旦我看到那四十行 __trim 函数,我就失去了阅读问题中更多代码的意愿”这就是精神......:D
  • o.O 现在我只是觉得我被困在愚蠢的地方,停在愚蠢的地方。该死,有人送我回学校(哈哈是自学成才,难怪这么多人做得更好)......应该也解释一下被弃用的mySQL
  • check_account-number 的值为“1”。也许我误读了答案,但 all_validation_accounts 确实是一个数组....(来自您上面的示例)....非常感谢您的帮助
  • 关于错误日志,我已经工作了好几天才能打开错误日志记录,但在我的一生中都找不到 bluehost 的选项(即使在重新配置 php.ini 后)。 ini)
  • 我建议在您自己的计算机上使用本地服务器,同时一起学习和开发。谷歌“Xampp”。它易于设置,您还可以控制 php.ini 和许多其他参数。 xampp 中的默认 php.ini 用于启用所有错误和警告的开发。
【解决方案2】:

警告:这不是问题的答案

让我们从减少类固醇开始:

使用内置的 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。它已弃用。使用它意味着招惹麻烦。

【讨论】:

  • 我很抱歉,标准 MySQL 是我最熟悉的语言。在重新优化代码库之前,我必须研究基于 PDO 的函数......但话又说回来,它有一长串需要做...
  • mysqli 接口非常接近mysql。采用它需要几秒钟。
  • 我在重新思考逻辑后修复了这个问题。 stackoverflow.com/questions/15775444/…
【解决方案3】:

通过重新思考检查背后的逻辑,我已经回答了我自己的问题。
感谢您的所有回复。

这是解决方案的链接。我把它发布到网上分享和优化,因为 SO 所有伟大的思想都值得拥有!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多