【问题标题】:Foreach exploded string is stoppedForeach 爆炸字符串停止
【发布时间】:2015-04-21 20:04:20
【问题描述】:

我正在处理 eshop(like)脚本,付款后将您添加到数据库访问内容。 我使用 PHP 5 和 MySQL

问题介绍

  1. 我有两个字符串。每个都有一些用逗号分隔的值。像这样的东西 - testValue1,testValue2,TestValue3
  2. 我对这两个字符串使用explode 函数来创建数组。用逗号爆炸效果很好。
  3. 如果用户在他的产品中有类似的东西,我会查看第一个数组中的 Foreach 值,如果没有 -> 写入如果是 -> 在 DB 内容之后写入.
  4. HERE 出现问题。脚本完美地工作,而不是一件事。 Foreach 循环在第一次运行后退出。它写入 db 正确的值,但只写入其中一个。

我想要什么

$stringOne = "testProduct1,testProduct2";

数据库中的用户 -> 产品 -> testProduct1#testProduct2

(出于自己的原因,我用 # 分隔产品)

我真正得到了什么

$stringOne = "testProduct1,testProduct2";

数据库中的用户 -> 产品 -> testProduct1

代码

$array_mesta = explode(',', $mesta);
$array_ceny = explode(',', $ff['ceny']);
//$ff['ceny'] and $mesta are string which i get from DB few rows above

foreach($array_mesta as $key => $mesto) {

    if (strpos($array_ceny[$key],'6 měsíců') !== false) {
        $delka = '183';
    }
    if (strpos($array_ceny[$key],'12 měsíců') !== false) {
        $delka = '365';
    }

    $query = "SELECT * FROM makleri WHERE email = '".$email."'";
    $sth = mysql_query($query);
    while($r = mysql_fetch_assoc($sth)) {

        $level = $r['level'];
        $od = $r['od'];
        $do = $r['do'];

        if ((strpos($level,'#') !== false) or ($level !== "null")) {
            echo "už v db něco má, zapíšu zato /n";
            $sql = mysql_query("UPDATE makleri SET level = '".$mesto."#rok', od = '".$od."#0"."', do = '".$do."#".$delka." WHERE email = '".$email."'");
        }
        else {
            echo "nic v db nemá, vše přepíšu /n";
            $sql = mysql_query("UPDATE makleri SET level = '".$mesto."', od = '0', do = '".$delka."' WHERE email = '".$email."'");
        }
    }       
}/* foreach */

更新整个函数

function processPayment() {
    self::setState(GopayHelper::PAID);

    $orderNumber = self::getOrderNumber();
    $email = self::getEmail();


    $ss = "SELECT * FROM procesy WHERE orderNumber = '$orderNumber'";
    $jqr2 = mysql_query($ss);
    while($ff = mysql_fetch_assoc($jqr2)) {

        $prevodni_tabulka = Array('ä'=>'a', 'Ä'=>'A', 'á'=>'a', 'Á'=>'A', 'à'=>'a', 'À'=>'A',
                                  'ã'=>'a', 'Ã'=>'A', 'â'=>'a', 'Â'=>'A', 'č'=>'c', 'Č'=>'C',
                                  'ć'=>'c', 'Ć'=>'C', 'ď'=>'d', 'Ď'=>'D', 'ě'=>'e', 'Ě'=>'E',
                                  'é'=>'e', 'É'=>'E', 'ë'=>'e', 'Ë'=>'E', 'è'=>'e', 'È'=>'E',
                                  'ê'=>'e', 'Ê'=>'E', 'í'=>'i', 'Í'=>'I', 'ï'=>'i', 'Ï'=>'I',
                                  'ì'=>'i', 'Ì'=>'I', 'î'=>'i', 'Î'=>'I', 'ľ'=>'l', 'Ľ'=>'L',
                                  'ĺ'=>'l', 'Ĺ'=>'L', 'ń'=>'n', 'Ń'=>'N', 'ň'=>'n', 'Ň'=>'N',
                                  'ñ'=>'n', 'Ñ'=>'N', 'ó'=>'o', 'Ó'=>'O', 'ö'=>'o', 'Ö'=>'O',
                                  'ô'=>'o', 'Ô'=>'O', 'ò'=>'o', 'Ò'=>'O', 'õ'=>'o', 'Õ'=>'O',
                                  'ő'=>'o', 'Ő'=>'O', 'ř'=>'r', 'Ř'=>'R', 'ŕ'=>'r', 'Ŕ'=>'R',
                                  'š'=>'s', 'Š'=>'S', 'ś'=>'s', 'Ś'=>'S', 'ť'=>'t', 'Ť'=>'T',
                                  'ú'=>'u', 'Ú'=>'U', 'ů'=>'u', 'Ů'=>'U', 'ü'=>'u', 'Ü'=>'U',
                                  'ù'=>'u', 'Ù'=>'U', 'ũ'=>'u', 'Ũ'=>'U', 'û'=>'u', 'Û'=>'U',
                                  'ý'=>'y', 'Ý'=>'Y', 'ž'=>'z', 'Ž'=>'Z', 'ź'=>'z', 'Ź'=>'Z'
                                  ); 
        $mesta = strtr($ff['mesta'], $prevodni_tabulka);

        $array_mesta = explode(',', $mesta);
        $array_ceny = explode(',', $ff['ceny']);

        foreach($array_mesta as $key => $mesto) {

            if (strpos($array_ceny[$key],'6 měsíců') !== false) {
                $delka = '183';
            }
            if (strpos($array_ceny[$key],'12 měsíců') !== false) {
                $delka = '365';
            }

            $query = "SELECT * FROM makleri WHERE email = '".$email."'";
            $sth = mysql_query($query);
            while($r = mysql_fetch_assoc($sth)) {

                $level = $r['level'];
                $od = $r['od'];
                $do = $r['do'];

                if ((strpos($level,'#') !== false) or ($level !== "null")) {
                    echo "už v db něco má, zapíšu zato /n";
                    $sql = mysql_query("UPDATE makleri SET level = '".$mesto."#rok', od = '".$od."#0"."', do = '".$do."#".$delka." WHERE email = '".$email."'");
                }
                else {
                    echo "nic v db nemá, vše přepíšu /n";
                    $sql = mysql_query("UPDATE makleri SET level = '".$mesto."', od = '0', do = '".$delka."' WHERE email = '".$email."'");
                }
            }
        }/* foreach */
    }/* while */
}

数据库值

$ff['mesta'] = "Brno,Praha,Olomouc";
$ff['ceny'] = "12 měsíců - Cena za měsíc - 100 Kč bez DPH,6 měsíců - Cena za měsíc - 100 Kč bez DPH,6 měsíců - Cena za měsíc - 100 Kč bez DPH";

$level, $od, $do 在 foreach 之后的输出:

$level = "Brno";
$od = "0";
$do = "365";

【问题讨论】:

  • 你应该检查 php 运行时间,因为可能 php 比你的 DB 运行时更快。
  • 您从第一个数组中写入了 Foreach 值,如果用户在他的产品中有类似的东西,我会查看 DB。但是您的查询不会从数据库中的第一个数组中查找值,而是查找$email
  • 请贴出整个函数代码让我们检查每个变量的值,并从数据库中添加一些真实值。
  • 我编辑了我的问题。你现在可以看到整个功能。 @Barmar 我只为行查找电子邮件,但在它之后我得到 $level 变量,这意味着 - $product 或限制级别。
  • 谢谢你们详尽的回答!我到处寻找,实际上我发现了这个问题。我错过了 foreach 中的第一个 sql ' 在 WHERE 之前!天哪

标签: php mysql arrays foreach


【解决方案1】:

作为stated by op,此语句中缺少一个单引号,在 where 之前:

$sql = mysql_query("UPDATE makleri SET level = '".$mesto."#rok', od = '".$od."#0"."', do = '".$do."#".$delka." WHERE email = '".$email."'");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多