2013-03-11 65 views
0

我是新來的PDO語句,到目前爲止我已經設法使用它,使用準備好的語句和許多東西,直到今天。bindParam沒有完成sql查詢

我有兩個查詢,第一個檢索一些數據,存儲結果,然後第二個查詢使用該數據檢索最終數據。我正在設計一個糟糕的設計數據庫,這就是爲什麼我必須做奇怪的事情。

第一個查詢獲取運動聯賽的開始年份和結束年份。然後,將年份傳遞給第二個查詢以獲取這些年份(WHERE)之間的數據。

的問題是,bindParam似乎不起作用,它不綁定參數,顯示了一個,然後將SQL拋出以下異常:

Connection failed: SQLSTATE[42000]: Syntax error or access violation: 
1064 You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use 
near ''0701' AND ?'0630' ORDER BY e.FECHA DESC' at line 5 

的SQL:

$sqlQueryAuxiliar = "SELECT ano_inicio, ano_fin 
        FROM TEMPORADAS 
        ORDER BY ano_inicio DESC 
        LIMIT 1;"; 

$sqlQuery = "SELECT e.id, e.JORNADA, DATE_FORMAT(e.FECHA, '%Y-%m-%d'), 
      e.HORA, c1.nombre_temporada, c2.nombre_temporada 
      FROM ENCUENTROS AS e 
      JOIN CLUBS AS c1 ON (e.COD_EQUIL = c1.siglas) 
      JOIN CLUBS AS c2 ON (e.COD_EQUIV = c2.siglas) 
      WHERE e.FECHA BETWEEN :anoInicio'0701' AND :anoFinal'0630' 
      ORDER BY e.FECHA DESC;"; 

這是PHP代碼:

$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$stmtAux = $this->_db->prepare($sqlQueryAuxiliar); 
$stmtAux->execute(); 
$fetched = $stmtAux->fetchAll(); 
$stmtAux = null; 
$stmt = $this->_db->prepare($sqlQuery); 
$stmt->bindParam(':anoInicio', $fetched[0][0], PDO::PARAM_STR, 12); 
$stmt->bindParam(':anoFinal', $fetched[0][1], PDO::PARAM_STR, 12); 
$stmt->execute(); 
while ($row = $stmt->fetch()) { 
    $partidos[] = $row; 
} 
$stmt = null; 
+0

我認爲涉及到單個配額'「0701''和'」 0630''錯誤,逃避他們,然後再試一次 – 2013-03-11 16:43:02

+0

有什麼':anoInicio'後面的''0701',或':anoFinal'後面的''0630''應該是?這是一個嘗試連接數字與綁定變量? – 2013-03-11 16:43:43

+0

@MarkBaker月和日。結果應該是:「YearMonthDay」,如「20130701」。這個數據庫不使用標準時間戳,這是一個痛苦的工作。 – Deses 2013-03-11 16:45:33

回答

1

按理說,你正在構建無效的SQL:

WHERE e.FECHA BETWEEN :anoInicio'0701' AND :anoFinal'0630' 

將建成基本

WHERE e.FETCHA BETWEEN foobar'0701' AND barbaz'0630' 

這是一個語法錯誤。

你可能想

WHERE e.FETCH BETWEEN concat(:anoInicio, '0701') AND concat(:anoFinal, '0630') 

代替。

+0

謝謝,那終於奏效了。奧拉夫方法仍然造成錯誤。 – Deses 2013-03-11 17:00:02

0

如果您使用綁定參數則不應再路過在查詢的一個硬編碼值..

"SELECT e.id, e.JORNADA, DATE_FORMAT(e.FECHA, '%Y-%m-%d'), e.HORA, c1.nombre_temporada, c2.nombre_temporada 
      FROM ENCUENTROS AS e 
      JOIN CLUBS AS c1 ON (e.COD_EQUIL = c1.siglas) 
      JOIN CLUBS AS c2 ON (e.COD_EQUIV = c2.siglas) 
      WHERE e.FECHA BETWEEN :anoInicio AND :anoFinal 
      ORDER BY e.FECHA DESC;"; 
2

您不能以這種方式連接查詢中的字符串。您的查詢更改爲

SELECT e.id, e.JORNADA, DATE_FORMAT(e.FECHA, '%Y-%m-%d'), e.HORA, c1.nombre_temporada, c2.nombre_temporada 
       FROM ENCUENTROS AS e 
       JOIN CLUBS AS c1 ON (e.COD_EQUIL = c1.siglas) 
       JOIN CLUBS AS c2 ON (e.COD_EQUIV = c2.siglas) 
       WHERE e.FECHA BETWEEN :anoInicio AND :anoFinal 
       ORDER BY e.FECHA DESC 

bindParam s到

$stmt->bindValue(':anoInicio', $fetched[0][0] . '0701', PDO::PARAM_STR); 
$stmt->bindValue(':anoFinal', $fetched[0][1] . '0630', PDO::PARAM_STR); 
+0

如果我這樣做,則會引發此異常: '致命錯誤:無法通過引用傳遞參數2' '$ stmt-> bindParam(':anoInicio',$ fetched [0] [0]。'0701', PDO :: PARAM_STR,12);' – Deses 2013-03-11 16:48:34

+0

@決定哪個例外? – ShuklaSannidhya 2013-03-11 16:49:20

+0

好吧,我不得不定義變量而不是傳遞數組。 '$ foo = $ fetched [0] [0]; $ stmt-> bindParam(':anoInicio',$ foo。'0701',PDO :: PARAM_STR,12);' – Deses 2013-03-11 16:54:30