2011-02-02 40 views
2

我編輯的問題更加具體奇怪的問題,並明確與SQL查詢

我有一個獨立的PHP文件如下代碼:

$conn = mysql_connect("localhost", "", ""); 

mysql_select_db("name", $conn); 

$result = mysql_fetch_array(mysql_query("SELECT EVENT_PRIVATE FROM events WHERE EVENT_ID = 68")); 

var_dump($result); 

結果是NULL

但是,如果我將完全相同的查詢複製到phpMyAdmin,則可以看到EVENT_PRIVATE的值爲1。

enter image description here

我只有一個數據庫,所以我肯定是使用相同的數據庫,另外,如果我選擇一個不同的專欄中,我可以看到正確的值。

我不明白,是嗎?

+2

什麼做`的var_dump($決賽[ 'EVENT_PRIVATE']);`,`的var_dump($最後);`和`var_dump($ result);`show?如果它的布爾型假或空字符串沒有可見的輸出將是所需的行爲。 – 2011-02-02 16:40:57

+0

如果您將查詢更改爲「SELECT EVENT_PRIVATE FROM events ...」而不是「SELECT * FROM events ...」,您在phpMyAdmin中看到了什麼?那一欄的實際價值是多少? – 2011-02-02 16:41:33

+0

而`$ result ['EVENT_PRIVATE']`有一個合適的值?什麼`var_dump`打印? – Gumbo 2011-02-02 16:41:44

回答

2

我在PHP和MySQL的匹配版本上試過這個,它似乎是奇怪的關於PHP「mysql」函數處理位域的方式,或者至少是我不明白的東西。它看起來有點像一個bug。它可以像我期望的那樣在「mysqli」擴展中運行。這是我的嘗試:

<?php 
// mysql: 
$conn = mysql_connect('localhost', 'test', 'test'); 
mysql_select_db("test", $conn); 
$result = mysql_fetch_array(mysql_query('SELECT EVENT_PRIVATE FROM test WHERE id = 2')); 
var_dump($result); 

/* Result: 
array(2) { 
    [0]=> 
    string(1) "" 
    ["EVENT_PRIVATE"]=> 
    string(1) "" 
} 
*/ 

// mysqli: 
$mysqli = new mysqli('localhost', 'test', 'test', 'test'); 
$mysqli_result = $mysqli->query('SELECT EVENT_PRIVATE FROM test WHERE id = 2'); 
$result = $mysqli_result->fetch_array(); 
var_dump($result); 

/* Result: 
array(2) { 
    [0]=> 
    string(1) "1" 
    ["EVENT_PRIVATE"]=> 
    string(1) "1" 
} 
*/ 

編輯:啊哈!

該書"High Performance SQL"說'MySQL將BIT視爲字符串類型,而不是數字類型;當您檢索BIT(1)值時,結果是一個字符串,但其內容是二進制值0或1,而不是ASCII值「0」或「1」。

我期待BIT能夠像SQL Server「bit」數據類型一樣,它是爲存儲布爾值true/false(0/1)值而設計的。但是,在MySQL中它更像是一個位域 - 與SQL Server不同,例如,您可以有一個位(8)字段,其長度爲8位。而MySQL有一個特定的「布爾」類型,用於存儲布爾值。

我猜這是發生了什麼事情的根源。請注意,mysql結果返回的是字符串(1) - 這是一個單字符長字符串,而不是空字符串,它將是字符串(0)。如果你看看單個字符的值:

echo ord($result['EVENT_PRIVATE']); 
1 

......那麼這是ASCII 1!

所以,我想說,發生了什麼可能,奇怪的是,由設計。 mysql擴展是解釋位域的一個非常直接的字符,並且給出了一個字符串編碼的實際位,它們存儲在MySQL的字段中,位級。 mysqli擴展也許有點友好,並將該值轉換爲位的字符串表示。

我要把它留給你,如果你搶位(8)設置爲使用mysql和mysqli的10101010發生了什麼實驗?

-1

將您的*替換爲字段名稱,以查看它是否抱怨EVENT_PRIVATE。也許它不應該是上限,或者你得到了錯誤連接的結果。

0

嘗試將您的查詢限制爲單個event_id。在PHPMyAdmin上運行,然後通過PHP運行。你應該看到相同的值。

請注意,$final的分配與問題無關,因爲它不會有缺陷。問題出在$results

-1

請試試這個:

$result = mysql_fetch_array(mysql_query("SELECT EVENT_PRIVATE FROM events WHERE EVENT_ID = '68'")); 

我只是在68左右添加單引號。讓我知道它是否適合你。

編輯:

就有關SQL查詢單引號和雙引號的更多信息,你可以檢查THIS link