mongoDB中的PHP更新查询无法正常工作

时间:2014-09-22 14:38:20

标签: php mongodb mongodb-php

我正在尝试更新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>

我已经采取了#id; id&#39;通过POST方法从不同的文件中搜索并在此文件中搜索所需的文档。然后我引用了更新查询。但它不起作用

以及如何检查表单中是否选择了图像?如果上传新图像,我想替换现有图像。

提前致谢

1 个答案:

答案 0 :(得分:2)

  

我通过POST方法从不同的文件中获取了'id'并进行了搜索   对于此文件中的所需文档。然后我引用了更新查询。但   它无法正常工作

如果您从集合中选择单个文档,则应考虑使用MongoCollection::findOne(),它可以方便地返回第一个匹配的文档(作为关联数组)或null如果没有找到文档。这比使用find()创建Cursor并调用getNext()更有效。

乍一看,我认为表单无法正常运行,因为您没有正确回显标识符值。引用你的例子:

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

<?php $id?>本质上是一个NOP。您可能需要将$id打印为字符串。

作为侧面观察,我认为没有理由$set更新查询中的imgid字段。在find()查询和更新之间,此值永远不会更改。此外,$id以前已分配给$book['_id']$id应该已经是MongoId对象。在这种情况下,没有理由在更新条件中构造新的MongoId对象。您应该可以按原样使用$book['imgid'](因为它是MongoId)。

  

以及如何检查表单中是否选择了图像?我想要   如果上传新图像,请替换现有图像。

除了使用GridFS文件存储用户名之外,我还建议添加书籍标识符,以便您可以根据需要轻松确定文件文档中的相关书籍。您看到的注释代码看起来是正确的。可能缺少的是删除原始文件,即{{1}}(如果有的话)。我建议推迟这个清理步骤,直到新的GridFS插入和更新成功为止。


另请注意:您不应在脚本末尾调用MongoClient::close()。实际上,文档强烈反对它,因为它会破坏驱动程序使用持久连接的能力。

此外,由于您似乎使用用户名作为集合名称,我建议您查看MongoDB的collection naming restrictions以确保您不会无意中尝试使用无效名称。这看起来像是一种多租户尝试,通常在数据库级别而不是单独的集合中完成。除非您确实需要隔离数据,否则我建议将其存储在单个集合中。这将要求您在每个书籍文档中存储用户名,或者更好的是用户标识符;但是,单个集合可以更容易地跟踪索引并避免将用户名用作集合名称时可能发生的冲突。