2016-04-28 23 views
0

我有一個php函數,它將從users數據庫的列中獲得名稱列表。我想要做的是從列name中獲取所有值並將其插入到數組中。使用mysql查詢從單列返回值

我從PHP端所做的是:

header('Content-type: application/json'); 
include ('../Core/Initialization.php'); 

$courseName = $_POST['courseName']; 
$semester = $_POST['semester']; 

$sql = mysql_query("SELECT DISTINCT `name` FROM `users` WHERE `programme` = '$courseName' AND `semester` = '$semester'") or trigger_error(mysql_error().$sql); 
$column = mysql_fetch_assoc($sql); 

$arr = array(); 
foreach($column as $value) { 
$arr[] = array('name' => $value['name']); //I have tried it this way but it didn't work when I try to display the values. 
} 

echo json_encode($arr);//I have tried to remove the array and just json_encode($column). I have successfully print out the first values, but fail to print out the next values collected from the column. 

JS的功能,將處理/打印出了名:

function nameProcess(data) { 
alert(data.name); //This will only display the full values from the first(?) index 

nameArray = data.name; 

for (var i=0; i < nameArray.length; i++) { 
alert(nameArray[i]); //But, this loop only displays one character each time of the alert. Example: Each character from the word "Hello" will show up one by one as alert. 
} 
    } 

}); 

有沒有什麼更好的方法來做到這一點?我想要做的是,將列name中的所有值導出到數組中,並將其每個值作爲選擇框的選項進行迭代。但現在,我該如何解決這個問題?

+1

**警告**:如果您只是學習PHP,請不要使用['mysql_query'](http://php.net/manual/en/function.mysql-query.php)界面。這是非常可怕和危險的,在PHP 7中被刪除了。[PDO的替代品並不難學](http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps- pdo-for-database-access /)和[PHP The Right Way](http://www.phptherightway.com/)等指南介紹了最佳實踐。你的用戶參數是**不是** [正確轉義](http://bobby-tables.com/php),並且有[SQL注入漏洞](http://bobby-tables.com/)可以被利用。 – tadman

回答

0

首先,不要使用mysql_ *功能,因爲它們已被取消, 完全刪除PHP 7.

回到你的問題,你可以使用MySQL的mysql獲取多維數組只與循環。

更正代碼:

$sql = mysql_query("SELECT DISTINCT `name` FROM `users` WHERE `programme` = '$courseName' AND `semester` = '$semester'") or trigger_error(mysql_error().$sql); 
$res = mysql_query($sql); // Missing this. 
$column = ; 
$arr = array(); 
while ($value = mysql_fetch_assoc($res)) { 
$arr[] = $value['name']; 
} 
echo json_encode($arr); 
+0

我已經用你的代碼更新了php。但似乎'alert(data.name)'和'alert(nameArray [i])'不再顯示任何警報/彈出窗口? –

0

注:PHP的MySQL命令使用的是已被棄用。建議使用PDO類(因爲MySQLi也被棄用)。

這取決於預處理要執行,但是從我可以根據您提供的信息看,你是路過返回數據的每一個元素通過對nameProcess

所以

array(
    array('name' => 'John Smith', 
    array('name' => 'Jane Doe', 
    array('name' => 'Foo Bar' 
); 

返回數據將需要nameProcess函數被調用3次。

所以每次經過時間來定義

nameArray = data.name; 

nameArray成爲自data.name一個字符串爲「約翰·史密斯」的第一次調用,「李四」的第二調用,以及「foo bar」的上次調用。

所以,當你調用

alert(nameArray[i]); 

它的字符串中停靠的位置我的性格。

nameArray[0]; // 'J' 
nameArray[1]; // 'o' 
nameArray[2]; // 'h' 
nameArray[3]; // 'n' 
// etc 

如果將其更改爲:

function nameProcess(data) { 
    alert(data.name); 
    nameArray = data.name; 
    alert(nameArray); 
} 

它會提醒的全名。

解決這個問題的辦法是,以確保您通過JSON解析數據,而無需預先處理的功能,在這種情況下,如果將其更改爲原來的代碼應工作:

function nameProcess(data) { 
    alert(data.name); 

    nameArray = data.name; 

    for (var i=0; i < nameArray.length; i++) { 
     alert(nameArray[i].name); 
    } 
} 
+0

你好,謝謝你的詳細解釋。我已經改變了你的功能代碼。但是現在,它不是逐個循環字符,而是每次循環顯示「未定義」。但是,如果我從alert(nameArray [i] .name);'中移除'.name',它將逐個顯示該字符。呃 –

+0

當你傳遞給'nameProcess'時,你能提供一個'data'的例子嗎?這聽起來像你還在一次傳遞一個數組項,所以'data.name'是一個字符串。 – ScarecrowAU