今天工作時,遇到一個無解的問題
我自己新增 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不是我寫了 哈哈
從程式看來沒啥大問題。
但我有注意到一點的就是,你有用了大小寫檔名。
依照過往的經驗,推測你開發是windows系統,正式是linux系統。
這是我曾經發生過的經驗。
如你目前用的是B.php。
我曾經發生過因別的工程師他的命名是用 b.php (似乎是因為編輯器的關係給他改名的)
但我們一直沒注意到。
由於在windows系統上,是不分大小寫的。所以自然一直都沒事。
上架後就開始發生程式怎麼改都不對。
一直到我接手查bug。也發生了你說的,只是先放過記錄用的程式碼。
居然就好了。
經過後來查看。才總算在正式機上。去看到了 B.php 跟 b.php 兩支檔案同時存在。
(因linux是會區分大小寫檔名的)
當時的開發機制是用ftp上傳正式站的機制,還未用git的方式。
才會發生這樣的事。
不過這是我之前過往的經驗曾經碰過的事,跟你的情況有點類似。看看是否是這個因素。
要不然我也猜不到其它的可能性了。
if ($single_mode) {
$where = " and table1.column1 = " . $arrTest[$i];
}
我的推測是 b.php 中一開始可能有看不見的字符存在,
當您做了若干修改再重新存檔時(加上log之後),該隠形字符消失了。
我是有發生過類似的情形,移除行尾空白後,自然就好了。