2014-01-14 46 views
1

我有一個查詢,填充$row["app_id"]和當我通過div id="reveal"app_id更改。我想要做的是在$ revealstmt查詢中插入app_id。我不斷收到錯誤。無效的參數編號:綁定變量的數量不匹配令牌的數量'

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid  
parameter number: number of bound variables does not match number of tokens 

我的代碼如下

<?php 
    $revealid = $row["app_id"]; 
    while (isset($revealid)){ 
      $query3 = ""; 
      $revealstmt = $conn->prepare("SELECT logs.time_entry AS logs_entry, logs.description AS logs_description, substates.name AS reveal_substates_name FROM logs LEFT OUTER JOIN applications ON logs.fk_app_id = applications.pk_app_id LEFT OUTER JOIN substates ON logs.fk_substate_id = substates.pk_substate_id WHERE logs.fk_app_id = <?php echo $revealid ?> and time_entry >= curdate() - INTERVAL DAYOFWEEK(curdate()) + 14 DAY ORDER BY time_entry DESC;"); 
      $revealstmt->execute(array('query3' => $query3)); 
?> 

<div id="<?php echo $row["app_name"];?>" class='reveal-modal'> 
    <div id="reveal"> 
      <h1><?php echo $row["app_name"]; echo $revealid; ?> 
      <br /> 
      </h1> 
      <div class="accordion"> 
        <?php while ($revealrow = $revealstmt->fetch()){?> 
          <h3><a href=""><?php echo $revealrow["logs_entry"]?> -|- <? 
php echo $revealrow["reveal_substates_name"]; ?></a></h3> 
          <div><?php echo $revealrow["logs_description"]; ?></div> 
        <?php } ?> <!-- Close Tag for $revealrow --> 
    <?php } ?> <!-- Close tag for the while(isset) --> 

我一直在使用的foreach嘗試,但不能作爲$row["app_id"]不是一個數組它每次只返回1號。

希望我已經提供了所有需要的信息,如果不是,當然會添加我需要的任何信息。再次感謝社區爲您提供的所有幫助!

+0

哪裏'query3'出現在你的SQL查詢中?另外,我認爲你的佔位符需要以':'開頭。 –

+0

這是什麼'<?php echo $ revealid?>'在查詢內執行操作?你已經在PHP,你不能這樣做。改爲使用連接。 –

+0

我很可能是錯的,因爲我明顯在學習。我以爲query3是從SQL查詢返回的數組。另外我會檢查連接。我沒有意識到你可以在SQL Query中做到這一點,我認爲你必須回到PHP。 – ZeroAccess

回答

1

您應該在查詢中使用連接。此外,你不需要太長的查詢。以同樣的方式,你不會把所有的PHP寫在一行中,對於你的MySQL也是一樣:這是另一種語言。

$revealstmt = $conn->prepare(
    "SELECT logs.time_entry AS logs_entry, " . 
    "logs.description AS logs_description, " . 
    "substates.name AS reveal_substates_name " . 
    "FROM logs LEFT OUTER JOIN applications " . 
    "ON logs.fk_app_id = applications.pk_app_id " . 
    "LEFT OUTER JOIN substates ON logs.fk_substate_id = substates.pk_substate_id " . 
    "WHERE logs.fk_app_id = " . $revealid . " AND " . 
    "time_entry >= curdate() - INTERVAL DAYOFWEEK(curdate()) + 14 DAY " . 
    "ORDER BY time_entry DESC;"); 
$revealstmt->execute(); 

另一個問題是,你試圖將query3分配給東西。您的查詢中沒有?佔位符,因此,無需在​​中添加任何內容。但是,其他工作解決方案可能不安全,具體取決於您的$revealid來自何處。你可以把它做此保證:

$revealstmt = $conn->prepare(
    "SELECT logs.time_entry AS logs_entry, " . 
    "logs.description AS logs_description, " . 
    "substates.name AS reveal_substates_name " . 
    "FROM logs LEFT OUTER JOIN applications " . 
    "ON logs.fk_app_id = applications.pk_app_id " . 
    "LEFT OUTER JOIN substates ON logs.fk_substate_id = substates.pk_substate_id " . 
    "WHERE logs.fk_app_id = ? AND " . 
    "time_entry >= curdate() - INTERVAL DAYOFWEEK(curdate()) + 14 DAY " . 
    "ORDER BY time_entry DESC;"); 
$revealstmt->execute(array($revealid)); 
+0

謝謝,我剛剛開始做很多SQL,因爲我確定你可以告訴,但這絕對是我將開始處理的一件事。通常,當我在Workbench中進行查詢時,我喜歡它們,但是當我將它們放入代碼中時,我將它們全部放在一行中。再次感謝您的幫助! – ZeroAccess

2

我相信你的查詢準備語句有錯誤的語法。試試這個:

$revealstmt = $conn->prepare("SELECT logs.time_entry AS logs_entry, logs.description AS logs_description, substates.name AS reveal_substates_name FROM logs LEFT OUTER JOIN applications ON logs.fk_app_id = applications.pk_app_id LEFT OUTER JOIN substates ON logs.fk_substate_id = substates.pk_substate_id WHERE logs.fk_app_id = ".$revealid." and time_entry >= curdate() - INTERVAL DAYOFWEEK(curdate()) + 14 DAY ORDER BY time_entry DESC;"); 

如果您迴應就應該到標準輸出,而不是字符串值/查詢您正準備。

+0

非常感謝你!我已經爲此工作了將近2天,並且不知道我是否正在那裏開槍自殺。謝謝大家誰貢獻這麼多! – ZeroAccess

+0

-1,雖然這回答了OP的問題,但是它有一個安全漏洞,並且使用'sql injection'很容易攻擊。 –

+0

@FranciscoPresencia你是絕對正確的!沒有時間指出這一點...... – Kjell

0

$revealstmt->execute(array('query3' => $query3));這是你的問題,你的查詢有沒有約束力的值,但仍你在你的execute statment發送綁定的數組。通過將結合值,像這樣

$revealstmt = $conn->prepare("SELECT logs.time_entry AS logs_entry, logs.description AS logs_description, substates.name AS reveal_substates_name FROM logs LEFT OUTER JOIN applications ON logs.fk_app_id = applications.pk_app_id LEFT OUTER JOIN substates ON logs.fk_substate_id = substates.pk_substate_id WHERE logs.fk_app_id = :query3 and time_entry >= curdate() - INTERVAL DAYOFWEEK(curdate()) + 14 DAY ORDER BY time_entry DESC;"); 

,然後你執行YOUT查詢:

試試這個

$revealstmt->execute(array('query3' => $revealid));

OR:

$revealstmt->bindValue(':query3', $revealid);

相關問題