2015-10-14 55 views
0

試圖爲用戶做一個小小的搜索功能,以便他可以在HTML/PHP網頁上輸入日期,並查看db中的哪些人已經註冊爲成員在或之後(某個日期)。我的用戶以2015-10-01格式輸入日期。這會被髮送到一個帶有jqxGrid的PHP頁面,並填充符合我在MySQL數據庫上查詢(使用PDO)的成員的成員詳細信息。PHP/MySQL/PDO從數據庫的日期搜索

該查詢使用操作員> =作爲(例如)「2015年10月1日」 WHERE子句中,所以我使用STR_TO_DATE使比較工作傳遞的字符串:

WHERE `lastUpdated` >= STR_TO_DATE(? , '%Y-%m-%d'); 

通過PDO,後來被綁定到日期(作爲字符串傳入)。

註冊日期的db列爲DATETIME格式,在db值中看起來像:「2015-10-12 17:12:52」。

我的查詢每次都會返回一個空數組,並且在MySQL聲明和準備填充網格的數據的頁面上嘗試每個可以想到的日期格式排列的許多小時之後返回一個空數組。

有人可以告訴我這裏有什麼問題嗎?

謝謝! SP

+0

相同形式的原始SQL查詢是否有效? (沒有?)。 – apokryfos

+0

是的,在數據​​庫中,原始查詢是完美的。 – swissphp

+0

如果您確定日期將按照指定的格式進行格式化(無論如何都是有效的MySQL日期),也許您可​​以刪除STR_TO_DATE函數,因爲PDO可能無法將日期作爲參數綁定到函數。不是100%確定這一點。 – apokryfos

回答

0

讓它

WHERE `lastUpdated` > ? 

,並檢查您的數據和材料。

基本上,你不應該觸摸PDO,直到你獲得原始的SQL才能工作。

+0

這是我早期的一種置換。還返回一個空數組。我已經檢查了我的數據和內容,但是在2天內花了大約6個小時,我正在尋求幫助。我有很多類似於這個已經工作了多年的其他PDO查詢,但沒有一個涉及日期比較,這就是爲什麼我認爲問題出在那裏。 – swissphp

-1

我不知道這是否可以作爲答案,但至少它是可行的!這個問題有很多變量 - json,jqxgrid,pdo ...不要忘記有幾種方法可以使用PDO。我可能在不同的地方有過幾次錯誤。

(@apokryfos的STR_TO_DATE確實是不必要的)

最後,這是什麼工作:

在包含jqxGrid PHP頁面,發送到服務器的網址是:

url: 'my-json-responses.php?fct=getJSONAllMembersByDate&regDate=<?php echo $fromDate ?>' 

這個$ fromDate來自$ _POST,當用戶在輸入頁面輸入日期(格式爲2015-10-01)時。當含有jqxGrid負荷PHP頁面,它

$fromDate = $_POST['regDate']; 

的URL「過境」通過文件我-JSON-reponses.php,其中包含許多功能。它找到合適的人:

if ($_GET['fct'] == 'getJSONAllMembersByDate') 
{ 
     $result = getJSONAllMembersByDate($connectionObject, $_GET['regDate']); 
     echo $result; 
} 

的$結果被稱爲上包含所有我的PDO數據庫請求,包括文件:

function getJSONAllMembersByDate($PDOdbObject, $regDate) { try 
{ 
    $membersByDateSQL = "SELECT `id`, `name_first`, `name_last`, `organization`,`email`, `phone`,`source`,`comments`,`language_id`, `lastUpdated` FROM `member` WHERE lastUpdated>='$regDate'"; 

    $get=$PDOdbObject->query($membersByDateSQL); 
    $rows = $get->fetchAll(PDO::FETCH_ASSOC); 

    $json=json_encode($rows); 
    return $json; 
} 
catch (PDOException $e) 
{ 
    echo "There was a problem getting all members with this search query."; 
    echo $e->getMessage(); 
}} 

注意使用「我不能讓版本? 「在查詢工作中,因此直接傳遞變量$ regDate,並在變量周圍添加單引號,以使生活變得有趣。

這將返回我的所有用戶的2015年10月1日的一個很好的列表 - 確定,但認爲仍打開到MySQL注入攻擊...

但這場馬拉松式的調試之後,我現在開心就好了。 (所有改進自然都歡迎!) SP

0

好的,所以這裏是PDO版本,工作 - 傳入?代替日期:

function getJSONAllMembersByDate($PDOdbObject, $regDate) 
{ 
    try 
    { 
     $membersByDateSQL = "SELECT `id`, `name_first`, `name_last`, `organization`,`email`, `phone`,`source`,`comments`,`language_id`, `lastUpdated` FROM `member` WHERE lastUpdated>=?";//'$regDate' 

    $get=$PDOdbObject->prepare($membersByDateSQL); 
    $get->execute(array($regDate)); 
    $rows = $get->fetchAll(PDO::FETCH_ASSOC); 

    $json=json_encode($rows); 
    return $json; 
} 

,它的作品的事實證明有包含jqxwidget(之前我這裏貼的版本)文件中的其他錯誤。我肯定嘗試了大約一百萬種不同的東西來實現這個目標。