【问题标题】:Undefined Variable - Do Switch Statements have scope in PHP未定义的变量 - Switch 语句在 PHP 中是否具有作用域
【发布时间】:2012-11-15 05:42:39
【问题描述】:

大家好,这是我第一次发帖,我觉得这会很好,因为我完全卡住了。我的理解是 PHP 中的 switch 和 If/else 语句没有变量范围。

我的问题是我有一个包含大约 5 行值的 CSV 文件(示例文件),我需要将其放入 mySQL DB 表中(列标题在我的 switch 语句的“案例”中表示)但无论如何,我正在解析 CSV 文件并检查以确保数据在它应该在的列中并将其存储在一个变量中。然后,我将所有变量存储在一个数组中,该数组被序列化,然后传递到我的 SQL 查询中。

我继续收到错误 SCREAM:忽略错误抑制 ( ! ) 注意:未定义变量:C:\wamp\www\lcimport\serialize.php 中第 98 行的公司

但我知道这些变量在那里,因为我可以回显它们并且它们会被调用。但除非这些错误消失,否则我的查询将不会运行,因此不会填充我的数据库表。

我做错了什么?

   <?php
//define some constants
$db = 'lc';
mysql_connect('localhost', 'root', ''); 
mysql_select_db($db);
 mysql_error();
$uid = md5(uniqid(time()));

//we only have this here to be a row counter
$row = 1;
if (($handle = fopen("C:\\wamp\\www\\lcimport\\4records.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        //var_dump($data);
       // echo $data[0];
        echo '';
        if ($row === 1) {
        $header = $data;
       }     

        $row++;
        for ($c=0; $c < $num; $c++) {
            //echo $data[$c] . "<br />\n";
            if ($row === 2) continue;
             switch ($header[$c] ){
              case "Contact":
                      $contact = explode (" ", $data[$c]);
                      $firstName =  $contact[0];
                      $lastName =  $contact[1];
              break;

              case "Company":
                    $company = $data[$c];


              case "Address1":
              //store
                    $address1 = $data[$c];

              break;

              case "Address2":
                    $address2 = $data[$c];

              break;

              case "Address3":
                    $address3 = $data[$c];

              break;

              case "City":
                    $city = $data[$c];

              break;

              case "State":
                    $state = $data[$c];

              break;

              case "Zip":
                    $zip = $data[$c];

              break;

              case "Phone1":
                    $phone1 = $data[$c];
              break;

              case "Phone2":
                     $phone2 = $data[$c];
              break; 

              case "Phone 3":
                    $phone3 = $data[$c];
              break;

              case "Fax":
                    $fax = $data[$c];
              break;          

              case "Accountno":
                    $accountNo = $data[$c];
              break;

              default:
                $junk = $data[$c];
              break;


             }




        }       
        echo $company;  
            $meta = serialize(Array(
                    "firstname" => $firstName,
                    "lastname" => $lastName,
                    "lawfirmname" => $company,
                    'address' => $address1,
                    'city' => $city,
                    'state' => $state,
                    'zip' => $zip,
                    'fulladdress' => '',
                    'officenumber' => $phone1,
                    'faxnumber' => $fax,
                    'mobilenumber' => $phone2,
                    'email' =>'nothing',
                    'website' => 'somthing.com',
                    'privacy' => 0,
                    'status' =>1
                    )); 




        mysql_query("INSERT INTO `mg_profiles` (meta) VALUES ($meta)");
        mysql_error();

    }
    fclose($handle);
    }


?>

【问题讨论】:

  • 我很确定这与它有关:if ($row === 2) continue;

标签: php arrays variables scope switch-statement


【解决方案1】:

如果所有其他变量都存在并且工作正常,那么缺少的break; 应该是公司的问题。

在循环中与关系数据库进行通信不是一个好主意,将结果存储到数组中更节省内存和处理效率,并且在获得所有数据后,只需通过简单的请求进行插入,因为

INSERT INTO `mg_profiles` (meta) VALUES (...), (...), (...)

完美运行。

PHP 有一个command 来处理这样的进程:

while (($data = fgetcsv($handle, 1000, ",")) !== false) {
    if ($row == 1 || $row == 2) {
        $row++;
        continue;
    }
    list ($contact, $company, $address1 /*, ...*/) = $data;
}

【讨论】:

  • 多次插入一直有效,直到达到最大查询长度,此时您需要将查询拆分为块。
  • 这对我帮助很大!完全忘记了 list() 函数,它解决了我的问题,谢谢。如果我可以投票,我会
【解决方案2】:

只要在条件语句之前定义(if()之前)

$company = '';

由于 $company 只出现在条件语句中,当条件失败时,它是未定义的,因此错误

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多