[英]PHP PDO AJAX Query not working, my eyes are crossing
我正在重新編寫一個文件,該文件將動態生成查詢以搜索和匹配由ajax事件傳遞的字符串中的任何單詞。
我無法得到返回數據的東西。 它的行為就像一切正常,但事實並非如此。 我在firebug中得到的只是成功:true ..這很好,因為這意味着沒有錯誤,但是我的SQL結果沒有通過。
我知道這些代碼將會為你們所有人提供,但它不起作用......
我花了整整一天的時間重新處理這段代碼,所以它還不是很漂亮或完美,我只想讓它再次返回搜索結果...
比爾,如果你正在讀這篇文章,我沒有機會研究你上周建議的%LIKE替代方案......還在等你郵寄的書。
抱歉在您身上丟了很多代碼,但是我看不到這里有什么問題。
function CreateOptions($columns, $num_elements, $condition="AND") {
$colcount = count($columns);
$optionString = " ";
for ($ii=0; $ii < $num_elements; $ii++) {
if ($ii > 0)
$optionString .= " AND (";
for ($i=0; $i<$colcount; $i++) {
if ($i>0)
$optionString .= " OR ";
$optionString .= $columns[$i] . " LIKE '%:search$ii%'";
}
//$optionString .= ")";
}
return $optionString;
}
include_once('../sys/core/init.inc.php');
$json = array();
$result = array();
if (isset($_POST['searchTerm'])){
try {
$search = trim($_POST['searchTerm']);
$search = preg_replace('/\s+/', ' ', $search);
$search = explode(" ", $search);
$num_search_elements = count($search);
switch($_POST['category']) {
case ("account"):
$querySyntax = "SELECT
idAccount,
FirstName,
LastName,
Email,
Phone,
CCCity,
db_name.states.Abbreviation
FROM
db_name.account Right Join
db_name.states On
db_name.account.CCState =
db_name.states.ID
WHERE";
$cols = Array ("FirstName", "LastName", "Phone", "Email", "idAccount");
$querySyntax .= CreateOptions($cols, $num_search_elements);
break;
default:
break;
}
$querySyntax .= " LIMIT 50";
// Build and run query (change to execute)
$dbs = $dbo->prepare($querySyntax);
for($i=0; $i<$num_search_elements; $i++) {
if ($dbs->bindValue(":search$i", $search[$i], (is_int($search[$i]) ? PDO::PARAM_INT : PDO::PARAM_STR))) {
// yea i know... nothing here its all below still
} else {
die("BIND_ERROR");
}
}
$dbs->execute();
// Put the array together
$search_results = $dbs->fetchAll(PDO::FETCH_ASSOC);
//print_r($search_results);
foreach($search_results as $col=>$val) {
$result[$i][$col] = $val;
$i++;
//echo "$col >> $val";
}
$stmt = null;
$result["success"] = true;
}
catch (PDOException $e) {
$result["success"] = false;
$result["error"] = $e->getMessage() . " >> SQL: $querySyntax";
}
} else {
$result["success"] = false;
$result["error"] = "INVALID DATA";
}
header('Content-type: application/json');
echo json_encode($result);
這是我告訴Firebug回顯查詢時直接從Firebug中獲取的SQL:
SELECT
idAccount,
FirstName,
LastName,
Email,
Phone,
CCCity,
db_name.states.Abbreviation
FROM
db_name.account Right Join
db_name.states On db_name.account.CCState =
db_name.states.ID
WHERE
FirstName LIKE '%:search0%' OR
LastName LIKE '%:search0%' OR
phone LIKE '%:search0%' OR
email LIKE '%:search0%' OR
idAccount LIKE '%:search0%'
LIMIT 50
用“mar”替換:search0你從終端和phpmyadmin的db中得到這個:
1 Mar <my real name> myemail@email 1231231234 City FL
2 Martin Short mshort@movies.com 2147483647 Beverly Hills CA
4 Martin Short mshort@email.com 2146791243 Beverly Hills CA
5 Martin Short mshort@movies.coms 2146791243 Beverly Hills CA
嘗試使用:
header('Content-Type: text/javascript');
使用Firebug / Network視圖之類的內容檢查您的http結果-它可能會正確返回,只是沒有在Javascript中進行解析。
您的問題來自您生成的SQL查詢。 我建議您從PDO中獲取查詢,然后在phpmyadmin或mysql控制台中嘗試。 如果它在那里工作,那么你的PHP腳本沒有正確生成SQL。 如果是這樣的話,如果您向我們展示真實的sql查詢和數據庫中的結果,將會有很多幫助。
編輯:嘗試替換此:
for ( $i = 0; $i < $num_search_elements; $i++ ) {
if ( $dbs->bindValue(":search$i", $search[ $i ], (is_int($search[ $i ]) ? PDO::PARAM_INT : PDO::PARAM_STR)) ) {
有了這個
for ( $i = 0; $i < $num_search_elements; $i++ ) {
$var = ":search".$i;
if ( $dbs->bindValue($var, $search[ $i ], (is_int($search[ $i ]) ? PDO::PARAM_INT : PDO::PARAM_STR)) ) {
看看它是否有效。
您的問題可能在以下行中:
foreach($search_results as $col=>$val) {
$result[$i][$col] = $val;
$i++;
//echo "$col >> $val";
}
此時,代碼$ i從$ num_search_elements的值開始,並從那里向上計數。 在代碼中使用$ i最多計數$ num_search_elements的上一個循環之后,它永遠不會重新初始化並設置為0。
在上面的循環之后print_r($ result)會發生什么? 如果在此循環之前使用print_r($ search_results)會發生什么? 他們匹配嗎?
上面的代碼可以替換為:
foreach($search_results as $col=>$val) {
$result[][$col] = $val;
}
從0開始向上索引。
它沒有工作的共鳴是因為我在''中有綁定的搜索迭代(:search0 ...),它將它變成一個與數據庫中的任何東西都不匹配的文字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.