Я пытаюсь обновить массив в коде 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> | <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="https://web-answers.ru/wp-content/uploads/2019/03/LogoShortMedium.png" alt="Online book store"width="162" height="39" /> 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>
я взял ‘id’ из другого файла методом POST и искал нужный документ в этом файле. тогда я процитировал запрос на обновление. но это не работает
а также как я могу проверить, выбрано ли изображение в форме? Я хочу заменить существующее изображение, если новое изображение загружено.
заранее спасибо
я взял ‘id’ из другого файла методом 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
как есть (так как это MongoId).
а также как я могу проверить, выбрано ли изображение в форме? я бы хотел
заменить существующее изображение, если новое изображение загружено.
В дополнение к сохранению имени пользователя в файле GridFS, я бы предложил добавить идентификатор книги, чтобы вы могли легко определить соответствующую книгу из файла документа, если это будет необходимо. Код с комментариями у вас выглядит правильно. Чего не хватает, так это удаления исходного файла, который будет $book['imgid']
(если что-нибудь). Я бы предложил отложить этот этап очистки до тех пор, пока новая вставка и обновление GridFS не будут выполнены успешно.
На отдельном примечании: вы не должны звонить MongoClient::close()
в конце вашего сценария. Фактически, документация настоятельно поощряет против этого, поскольку это отрицает способность водителя использовать постоянные соединения.
Кроме того, так как вы, кажется, используете имена пользователей в качестве имен коллекций, я бы посоветовал вам просмотреть MongoDB ограничения именования коллекций чтобы убедиться, что вы случайно не пытаетесь использовать недопустимые имена. Это похоже на попытку мультитенантности, которая обычно выполняется на уровне базы данных, а не отдельными коллекциями. Если вам действительно не нужно разделять данные, я бы предложил сохранить их в одной коллекции для начала. Это потребует от вас сохранения имени пользователя или, что еще лучше, идентификатора пользователя в каждом документе книги; однако, одна коллекция значительно упрощает отслеживание индексов и позволяет избежать возможных конфликтов при использовании имен пользователей в качестве имен коллекций.
Других решений пока нет …