2013-02-20 4 views
0

В modelSlikeVrijednost У меня есть ссылка на первичный ключ model. 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

+0

Результаты sql обычно возвращаются как объекты массива, а не строки. попробуйте повторить $ modelID и посмотреть, что появляется, прежде чем пытаться использовать его в другом выражении. –

+0

@JeffHawthorne: Не когда используется mysqli :: bind_result, который привязывает значение столбца непосредственно к переменной PHP. – prodigitalson

ответ

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

+0

Im не на 100% уверен, что вы просите, но я думаю, что вы хотите «УДАЛИТЬ» форму как «model», так и «modelLinkovi» ... Если в этом случае ваш запрос будет выглядеть так: 'DELETE FROM model m, modelLinkovi ml WHERE ml.modelID = m.modelID И m.modelID =? ' – prodigitalson

+0

Конечно, поскольку оба они имеют столбец' modelID', 'ml.modelID = m.modelID' немного избыточно, но в большей степени соответствует тому, что вы используете для вытягивания данные. – prodigitalson

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 для рекомендации класса-помощника. API-интерфейс Mysqli не может быть трудоемким (что является одной из причин, по которым я предпочитаю PDO), поэтому помощник, который абстрагирует часть безумия, хорош. – prodigitalson

+0

Приятно знать, что для этой проблемы есть вспомогательный класс. Определенно использовать его в следующий раз. – Vucko

Смежные вопросы