2012-03-09 207 views
1

所以我有一個函數從表單中獲取一些字符串變量(在提交表單之後),然後使用這些變量運行查詢並返回結果行。 我有幾個條件工作正常,除了一個,我無法弄清楚什麼是錯的。 當我打印出查詢並運行它在phpMyadmin中 - 它工作得很好(例如返回3行),但它不能在頁面上運行(顯示0 rwos返回)。 我注意到的一件事是,當我做var_dump它給出正確的類型(字符串),但長度錯誤。修剪沒有任何區別。 所以FO例如字符串變量顯示錯誤的長度

$name2 = "John Doe"; 
var_dump($name1); 
var_dump($name2); 

該名2返回字符串(8) 但是當NAME1它返回的字符串(9),儘管名1也是「李四」 - 我不知道那額外的字符是什麼。 該變量來自選擇元素的表單。選擇從表中填充。在分配給name1之前,我修剪生成的POST值。字符編碼對於select元素中的名稱來自的表以及我在其上運行查詢的表是相同的。 如果我不添加名稱,表單中的所有其他變量都會正常傳遞並且查詢正確運行。再次,如果我打印出查詢(包含名稱條件)並複製並粘貼到phpMyAdmin - 它運行得很好。 我在這裏瘋了。

+3

什麼是'$ name1'和你的代碼?更加詳細一些。 – user973254 2012-03-09 18:32:24

+0

正如我在帖子中所說,它也是John Doe。它顯示了長度加上1個字符。 – 2012-03-09 18:35:04

+0

不僅'John Doe'可能有一些看不見的/特殊的字符。你可以使用echo的輸出嗎?|「 。 $ name1。 「|」'? – botzko 2012-03-09 18:38:22

回答

1

第一次看,這可能是一個字符編碼問題。

我不知道發生了什麼(有幾個到的數據對我來說),但我會建議掃描兩個字符串(實際之一,你正在等待字符串),並有字符返回作進一步調查:

function compare($s1, $s2) { 
    $i = 0; 
    while ($s1[$i]) { 
     if ($s1[$i] != $s2[$i]) return array($s1[$i], $s2[$i]); 
     $i++; 
    } 
} 

var_dump(compare($name1, $name2)); 

編輯: 或許這樣的PHP線將幫助我更好地解釋我的意思。該字符串看起來平等的,但他們沒有在第二個中的一個是在 屏幕上呈現爲一個一個Cyrillic Character(但計算兩個字節,因此不同的strlen)

mb_internal_encoding('UTF-8'); 
$plainOldAscii = 'TASTE'; 
$aBitOfCyrillic = html_entity_decode('TАSTE', ENT_NOQUOTES,'UTF-8'); 
echo "$plainOldAscii -> " . strlen($oldPlainAscii) 
    . " -> "     . mb_strlen($oldPlainAscii) 
    . "\n$aBitOfCyrillic -> " . strlen($aBitOfCyrillic) 
    . " -> "     . mb_strlen($aBitOfCyrillic) 
    . "\n"; 
+0

它似乎是一個編碼問題,但我不知道爲什麼 - 我已經在上面發佈了我的解決方案。我已經打印出每一個名字,然後通過從屏幕上覆制和粘貼,將它們放回表格中。事情是 - 編碼在每個表格中都是一樣的,類型是相同的(varchar),並且在db表格中名稱和打印出的名稱之間沒有明顯的區別。在中間,開始或結束時沒有額外的空間,或類似的東西但是,在我刪除了現有名稱並將其放入屏幕後,查詢運行正常,函數返回預期結果。 – 2012-03-09 18:51:16

+0

@AR。我已經添加了一個示例來更好地解釋我認爲正在發生的事情 – Eineki 2012-03-11 03:00:57

0

也許是你的$ NAME1是類似於「John Doe」,末尾有空格或開頭處有空格...

+1

他表示輸入被修剪 – Eineki 2012-03-09 18:45:20

0

好的,這是一個數據庫問題。 仍然不知道如何可能 - 數據庫中的名稱或奇怪的字符中沒有多餘的空格。編碼是正確的,但在數據庫中是一樣的,但是在屏幕上打印出名字,然後複製並重新插入到名稱表中即可修復它。儘管沒有明顯的差異。奇怪的。