2014-09-22 4 views
0

Я пытаюсь обновить массив в mongoDB, код выполняется без ошибки, но документ не обновляется.PHP update query in mongoDB не работает

вот мой код:

<?php 
include 'connection.php'; 
session_start(); 
$username = $_SESSION ['username']; 
$collection = $database->selectCollection ($username); 

$books = $collection->find (array (
     '_id' => new MongoId ($_POST ['id']) 
)); 
$book = $books->getNext(); 
$imgid = $book ['imgid']; 
$id = $book['_id']; 

if (isset ($_POST ['formsubmit'])) { 

    $gridFS = $database->getGridFS(); 

    // if (isset ($_FILES ['pic'])) 
    // $imgid = $gridFS->storeUpload ('pic', array (
    // "username" => $username 
    //)); 

    $collection->update (array (
      "_id" => new mongoId ($id) 
    ), array (
      '$set' => array (
        'bookname' => $_POST ['bookname'], 
        'authname' => $_POST ['authname'], 
        'pubname' => $_POST ['pubname'], 
        'imgid' => $imgid, 
        'cost' => $_POST ['cost'] 
      ) 
    )); 

    echo '<h3>File Updated Successfully</h3>'; 

} 
$mongo->close(); 
?> 
<html> 
<head> 
<title>Online Book Exchange::Exchange old/Used books</title> 
<link rel="icon" href="images/favicon.ico"> 
<link href="style/own.css" rel="stylesheet" type="text/css"> 
</head> 
<body> 
    <div class="container_box"> 

     <div class="navbar"> 
      <p> 
       <a href="session.php">Dash Board</a> &nbsp;|&nbsp; <a 
        href="logout.php" 
        onClick="return confirm('Are you sure you want to Logout?')">Logout</a> 
      </p> 
     </div> 
     <br> <br> 
     <div class="motofont"> 
      <h3> 
       <img src="images/LogoShortMedium.png" alt="Online book store" 
        width="162" height="39" />&nbsp;&nbsp;&nbsp; Edit Book 
      </h3> 
      <hr> 
     </div> 
     <br> <br> 
     <div id="errorBox"></div> 
     <form name="form" method="POST" enctype="multipart/form-data" 
      action="editbook.php"> 
      <table width="60%" cellspacing="2" cellpadding="5" align="center"> 
       <tr> 
        <td> 
         <div class="reg_font">Book Name :</div> 
        </td> 
        <td><input type="text" name="bookname" id="bookname" class="txt" 
         value="<?php echo $book['bookname']; ?>" /></td> 
       </tr> 
       <tr> 
        <td> 
         <div class="reg_font">Author Name:</div> 
        </td> 
        <td><input type="text" name="authname" id="authname" class="txt" 
         value="<?php echo $book['authname']; ?>" /></td> 
       </tr> 
       <tr> 
        <td> 
         <div class="reg_font">Publication Name:</div> 
        </td> 
        <td><input type="text" name="pubname" id="pubname" class="txt" 
         value="<?php echo $book['pubname']; ?>" /></td> 
       </tr> 
       <tr> 
        <td> 
         <div class="reg_font">Cost</div> 
        </td> 
        <td><input type="text" name="cost" id="cost" class="txt" 
         value="<?php echo $book['cost']; ?>" /> <input type="hidden" 
         name="id" id="id" value="<?php $id?>" /></td> 
       </tr> 
       <tr> 
        <td><div class="reg_font">Upload an Image:</div></td> 
        <td><input type="file" name="pic" id="pic" class="btn_2" /></td> 
       </tr> 
       <tr> 
        <td colspan="2" align="center" valign="middle"><button 
          type="submit" value="Register" name="formsubmit" id="formsubmit" class="btn">Edit</button></td> 
       </tr> 
      </table> 
     </form> 
     <hr> 
    </div> 
</body> 
</html> 

я принял «идентификатор» из другого файла метод POST и искал требуемый документ в этом файле. затем я процитировал запрос на обновление. но его не работает

, а также как проверить, выбрано ли изображение в форме? Я хочу заменить существующее изображение, если загружено новое изображение.

заранее спасибо

ответ

2

я принял «идентификатор» из другого файла с помощью метода POST и искал для требуемого документа в этом файле. затем я процитировал запрос на обновление. но ее не работает

Если вы выбираете один документ из коллекции, вы должны рассмотреть возможность использования MongoCollection::findOne(), который удобно возвращает первый соответствующий документ (как ассоциативный массив) или null, если документ не был найден. Это более эффективно, чем создание курсора с find() и вызов getNext().

С первого взгляда, я бы предположил, что форма не работает, потому что вы неправильно повторяете значение идентификатора. Цитирую ваш пример:

<input type="hidden" name="id" id="id" value="<?php $id?>" /> 

<?php $id?> по существу NOP. Вероятно, вы хотите напечатать $id как строку.

Как побочное наблюдение, я не вижу причин для $set поля imgid в вашем запросе на обновление. Между запросом find() и обновлением это значение никогда не изменяется. Кроме того, $id ранее присвоен $book['_id'], который уже должен быть объектом MongoId. В этом случае нет причин для создания нового объекта MongoId в критериях обновления. Вы должны иметь возможность использовать $id as-is (так как это MongoId).

а также как проверить, выбрано ли изображение в форме? Я хочу, чтобы заменил существующее изображение, если загружено новое изображение.

В дополнение к сохранению имени пользователя в файле GridFS, я бы предложил добавить идентификатор книги, чтобы вы могли легко определить связанную книгу из файла документа, если это необходимо. Прокомментированный код выглядит корректно. Может отсутствовать удаление исходного файла, который будет $book['imgid'] (если вообще). Я бы предложил отложить этот шаг очистки до тех пор, пока новая вставка и обновление GridFS не завершится успешно.


На отдельной ноте: вы не должны называть MongoClient::close() в конце сценария. Фактически, документация настоятельно рекомендует против нее, так как она поражает способность водителя использовать постоянные соединения.

Кроме того, поскольку вы, как представляется, используете имена пользователей в качестве имен коллекций, я предлагаю вам просмотреть сведения от пользователя MongoDB collection naming restrictions, чтобы убедиться, что вы случайно не пытаетесь использовать недопустимые имена. Это похоже на попытку многопользовательской аренды, которая обычно выполняется на уровне базы данных вместо отдельных коллекций. Если вам действительно не нужно выделять данные, я бы предложил сохранить их в одной коллекции для начала. Это потребует от вас сохранить имя пользователя или, еще лучше, идентификатор пользователя в каждом книжном документе; однако одна коллекция упрощает отслеживание индексов и предотвращает возможные конфликты (конфликты) при использовании имен пользователей в качестве имен коллекций.