2013-02-20 102 views
0

modelSlikeVrijednost我參考了model -s主鍵。 ModelSlikeVrijednost可以包含很多圖片(取決於用戶)。我需要刪除基於modelID的文件夾。PHP MySQL準備好的語句中的語句

路徑示例:/home/mainSite/public_html/site/img/1/1/

可以做到這一點嗎?

代碼:

if ($stmt = $mysqli->prepare("SELECT modelID FROM model WHERE proizvodacID='$id'")) {  
    $stmt->execute(); 

    $stmt->bind_result($modelID); 

    while ($stmt->fetch()) { 
     $path="/home/mainSite/public_html/site/img/".$id."/".$modelID."/"; 

     if ($stmt1 = $mysqli->prepare("SELECT modelSlikeVrijednost FROM modelSlike WHERE modelID='$modelID'")) {  
      $stmt1->execute(); 

      $stmt1->bind_result($slike); 

      while ($stmt1->fetch()) { 
       if(is_null($slike)){ 
        rmdir($path); 
       } 
       else{ 
        $slikePath="/home/mainSite/public_html/site/".$slike; 
        if($slikePath!=$path){ 
         unlink($slikePath); 
        } 
        rmdir($path); 
       } 
      } 

      $stmt1->close(); 

     } 
     else { 
      printf("Prepared Statement Error: %s\n", $mysqli->error); 
     } 
    } 

    $stmt->close(); 

} 

我得到這個錯誤Prepared Statement Error: Commands out of sync; you can't run this command now Prepared Statement Error: Commands out of sync; you can't run this command now

+0

你應該在準備好的語句中綁定你的變量。 – jeroen 2013-02-20 14:12:50

+0

sql結果通常會返回爲數組對象,而不是字符串。嘗試回顯$ modelID並在嘗試在另一個語句中使用它之前查看顯示內容。 – 2013-02-20 14:13:21

+0

@JeffHawthorne:不是在使用將mysqli :: bind_result'直接綁定到PHP變量的值時。 – prodigitalson 2013-02-20 14:39:26

回答

3

不,你不能....您完成所有的結果需要循環,關閉遊標,或使用一個單獨的連接。

但是你正在嘗試做的是更好地完成了反正加入...

SELECT ms.modelSlikeVrijednost, m.modelID FROM model m, modelSlike ms 
WHERE ms.modelID= m.modelID 
AND m.proizvodacID ='$id' 

這會給你你每一行中需要的所有信息。

但是你也不正確地使用準備好的語句。你不應該直接傳遞php變量,你應該將它們作爲參數綁定到查詢中:

$sql = 'SELECT ms.modelSlikeVrijednost, m.modelID FROM model m, modelSlike ms' 
     .' WHERE ms.modelID= m.modelID' 
     .' AND m.proizvodacID = ?'; 

if($stmt = $mysqli->prepare($sql)) { 

    // bind the $id to the parameter as an integer 
    $stmt->bind_param('i', $id); 

    $stmt->execute(); 

    // bind the fields of the result to the same variables you had before 
    $stmt->bind_result($slike, $modelID); 

    // less prone to error if we only type this manually once :-) 
    $basePath = "/home/mainSite/public_html/site"; 

    while($stmt->fetch()) { 

     $path= $basePath . "/img/".$id."/".$modelID."/"; 
     $slikePath = $basePath . "/" . $slike; 

     if(is_null($slike)){ 
      rmdir($path); 
     } else { 
      if($slikePath!=$path) { 
       unlink($slikePath); 
      } 

      rmdir($path); 
     } 
    } 
} 
+0

這工作。謝謝。還有一個問題,我怎樣才能達到同樣的目的,但只有刪除?相同的第一個查詢,而不是第二個,我使用'DELETE FROM modelLinkovi WHERE modelID ='$ modelID''。它只會刪除最後一條記錄。 – Vucko 2013-02-20 14:50:40

+0

林不是100%確定你在問什麼,但我認爲你想從'模型'和'modelLinkovi'的'DELETE'形式......如果那樣的話你的查詢看起來像:'DELETE FROM model m,modelLinkovi ml WHERE ml.modelID = m.modelID AND m.modelID =?' – prodigitalson 2013-02-20 14:56:28

+0

當然,因爲它們都有'modelID'列'ml.modelID = m.modelID'有點多餘,但它與你用來拉數據。 – prodigitalson 2013-02-20 14:58:05

2

不要使用裸mysqli API。
讓自己一個輔助類,如safemysql
那麼你的代碼將

$models = $db->getCol("SELECT modelID FROM model WHERE proizvodacID=?i",$id); 
foreach($models as $modelID) { 
    $path = "/home/mainSite/public_html/site/img/$id/$modelID/"; 
    $sql = "SELECT modelSlikeVrijednost FROM modelSlike WHERE modelID=?i"; 
    $sarr = $db->getCol($sql, $modelID)); 

    foreach($sarr as $silke) { 
     if(!$slike)) { 
      rmdir($path); 
     } else { 
      $slikePath="/home/mainSite/public_html/site/".$slike; 
      if($slikePath!=$path){ 
       unlink($slikePath); 
      } 
       rmdir($path); 
      } 
     } 
    } 
} 

但是,是的,這是更好地做一個查詢,如prodigitalson說:

$sql = "SELECT ms.modelSlikeVrijednost, m.modelID FROM model m, modelSlike ms 
     WHERE ms.modelID= m.modelID AND m.proizvodacID=?i"; 
$sarr = $db->getCol($sql, $id); 
foreach($sarr as $silke) { 
    if(!$slike)) { 
     rmdir($path); 
    } else { 
     $slikePath="/home/mainSite/public_html/site/".$slike; 
     if($slikePath!=$path){ 
      unlink($slikePath); 
     } 
      rmdir($path); 
     } 
    } 
} 

主要思路是從查詢中獲取數據,然後使用它。

+0

+1用於推薦助手類。 Mysqli API無法使用(這是我更喜歡PDO的原因之一),因此一個能夠抽象出一些瘋狂的幫手是很好的。 – prodigitalson 2013-02-20 14:38:23

+0

很高興知道這個問題有一個助手類。下次肯定會用到它。 – Vucko 2013-02-20 14:51:32