iT邦幫忙

0

php 參數傳遞時,遇到神奇又無解的問題 (已解決)

php
  • 分享至 

  • xImage

今天工作時,遇到一個無解的問題

我自己新增 A.php,並透過 A.php 去呼叫 B.php 類別內的函式

(B.php 類別內的函式,在其他地方有被使用到)

一開始沒有去紀錄log,在開發和測試環境,使用很正常

但是到了正式環境,卻出現sql錯誤

查看error_log之後,發現 $arrTest[$single_count] 沒有值

後來在 A.php 加上log,是有資料的。想說觀察一下,還是有問題。

接著神奇的地方來了

我在 B.php 加上log之後,再行測試,居然就好了!居然就好了!居然就好了!

有沒有人知道是怎回事,或是有遇到這狀況

可否幫忙解惑也 ?

<?php
/**
 * 檔案 A.php
 */
require_once __DIR__ . 'xxxx/B.php';

$test_class = new test_class();

$arr = array("1", "2", "3", "4", "5", "6");

log($arr); // 紀錄 log A $arr

$test_class->testFunc($arr);



/**
 * 檔案 B.php
 */
class test_class
{
	public function testFunc($arrTest = array())
    {
        if (count($arrTest) == 6) {
            $single_mode = true;
        }
        
        $single_count = 0;

        for ($i = 0; $i <= 5; $i++) {
            if ($single_mode) {
                $where = " and table1.column1 = " . $arrTest[$single_count];
                $single_count++;
            }

            log($arr); // 紀錄 log B $arr

	    	$sql = " SELECT *
	    			 FROM table1
	    			 WHERE table1.column2 = 'xx'
	    			 $where
	    		   ";
        }
    }
}

抱歉 知道問題在哪了
的確是 $single_count 初始化出問題

其實還有另一個 array 的參數,透過它跑 foreach
再判斷 $arrTest
結果 $single_count = 0 卻放在最外層 (應該放在foreach內初始化)
導致 另一個參數如果2筆以上,$single_count++ 超過6
$arrTest[$single_count] 出問題

抱歉,造成困擾了 ~"~
先說好 B.php不是我寫了 哈哈

看更多先前的討論...收起先前的討論...
看不懂你 $single_count 這個變數在哪裡初始化
抱歉,我打範例的時候,忘記把變數 $single_count 初始化上去了,已補上!
柯柯 iT邦新手 3 級 ‧ 2020-12-08 14:25:07 檢舉
雖然跟問題無關
不過怎不用foreach

foreach($arrTest as $key => $value){
if($single_mode){
$where = "and table1.column1 = " . $value ;
$sql .....
}else{
log($arrTest);
}
}
抱歉,for ($i = 0; $i <= 5; $i++)
是我因範例需求,所以才放上去的..
試試看將資料庫抓回本機以及在本機開啟 E_ALL 除錯模式看看吧,不然你提供的 code 也只是你修改後發文的範本,很難幫上忙
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2

從程式看來沒啥大問題。

但我有注意到一點的就是,你有用了大小寫檔名。
依照過往的經驗,推測你開發是windows系統,正式是linux系統。

這是我曾經發生過的經驗。
如你目前用的是B.php。
我曾經發生過因別的工程師他的命名是用 b.php (似乎是因為編輯器的關係給他改名的)
但我們一直沒注意到。
由於在windows系統上,是不分大小寫的。所以自然一直都沒事。
上架後就開始發生程式怎麼改都不對。
一直到我接手查bug。也發生了你說的,只是先放過記錄用的程式碼。
居然就好了。

經過後來查看。才總算在正式機上。去看到了 B.php 跟 b.php 兩支檔案同時存在。
(因linux是會區分大小寫檔名的)

當時的開發機制是用ftp上傳正式站的機制,還未用git的方式。
才會發生這樣的事。

不過這是我之前過往的經驗曾經碰過的事,跟你的情況有點類似。看看是否是這個因素。
要不然我也猜不到其它的可能性了。

感謝浩瀚星空大大的分享!
因為是範例的關係,所以沒特別在意檔名

不論開發測試正式,都是linux的環境
只是開發測試環境,是正常的
只有正式環境,且只有我這支檔案,才會發生這問題
讓我覺得見鬼了 囧rz..

不過,因為我無正式環境的權限,也無法做更進一步的測試..

1
rogeryao
iT邦超人 8 級 ‧ 2020-12-08 12:59:57
if ($single_mode) {                
   $where = " and table1.column1 = " . $arrTest[$i];
}

抱歉,for ($i = 0; $i <= 5; $i++)
是我因範例需求,所以才放上去的..

rogeryao iT邦超人 8 級 ‧ 2020-12-08 14:49:39 檢舉

把瀏覽器的歷史瀏覽紀錄清除試試看吧

0
ckp6250
iT邦好手 1 級 ‧ 2020-12-08 14:55:56

我的推測是 b.php 中一開始可能有看不見的字符存在,
當您做了若干修改再重新存檔時(加上log之後),該隠形字符消失了。

我是有發生過類似的情形,移除行尾空白後,自然就好了。

我要發表回答

立即登入回答