PHP准备的语句不更新SQL数据库

PHP准备的语句不更新SQL数据库,php,mysql,pdo,Php,Mysql,Pdo,这是我第一次使用准备好的语句来更新MySQL。我不确定哪里出了问题,但当我点击提交按钮时,页面刷新,没有任何实际生效的更新 <?php session_start(); include_once("../includes/connection.php"); include_once("../includes/product.php"); $product = new Product; $products = $product->fetch_all(); if (isset($_

这是我第一次使用准备好的语句来更新MySQL。我不确定哪里出了问题,但当我点击提交按钮时,页面刷新,没有任何实际生效的更新

<?php session_start();

include_once("../includes/connection.php");
include_once("../includes/product.php");

$product = new Product;
$products = $product->fetch_all();

if (isset($_SESSION['logged_in'])) {

    if (isset($_GET['id'])) {
    $id = $_GET['id'];
    $sql_select = "SELECT * FROM products WHERE product_id = '{$id}'";
    $statement = $pdo->query($sql_select);
    $r = $statement->fetch(PDO::FETCH_ASSOC);
    }

    if (isset($_POST['submit'])) {
    if (isset($_POST['product_name'])) { $name = $_POST['product_name']; }
    if (isset($_POST['product_avail'])) { $avail = $_POST['product_avail']; }
    if (isset($_POST['product_price'])) { $price = $_POST['product_price']; }
    if (isset($_POST['product_desc'])) { $desc = $_POST['product_desc']; }
    if (isset($_POST['image'])) { $img = $_POST['image']; }

    $sql_update = 'UPDATE products SET (product_name, product_avail, product_price, product_desc, image) 
    VALUES (:name, :avail, :price, :desc, :img) WHERE product_id = :id';

    $updstmt = $pdo->prepare($sql_update);
    $updstmt->execute(array(
        ':id' => $id,
        ':name' => $name,
        ':avail' => $avail,
        ':price' => $price,
        ':desc' => $desc,
        ':img' => $img));
    }
?>
    <?php include_once("../includes/header.php"); ?>
        <h4>Edit product</h4>
            <!-- call error if any required fields are empty -->
            <?php if (isset($error)) { ?>
                <small style="color:#aa0000;">* <?php echo $error; ?>
            <?php } ?>
            <form action="edit_test.php?id=<?php echo $_GET['id']; ?>" method="post">
                <small>Product Name</small><br />
                    <input type="text" name="product_name" value="<?php echo $r['product_name']; ?>" <?php if (isset($error) && empty($_POST['product_name'])) { ?> class="error" <?php } ?>/>
                <br /><br />
                <small>Available?</small>
                    <input type="text" name="product_avail" value="<?php echo $r['product_avail']; ?>" <?php if (isset($error) && empty($_POST['product_avail'])) { ?> class="error" <?php } ?>/>
                <small>Price</small>
                &#36;<input type="number" min="0.01" step="0.01" name="product_price" value="<?php echo $r['product_price']; ?>" <?php if (isset($error) && empty($_POST['product_price'])) { ?> class="error" <?php } ?>/>
                <br /><br />
                <small>Product Description</small>
                    <textarea rows="20" cols="30" name="product_desc" <?php if (isset($error) && empty($_POST['product_desc'])) { ?> class="error" <?php } ?>><?php echo $r['product_desc']; ?>    </textarea><br /><br />
            <br /><br />
                <small>Product Image</small>
                <input type="text" name="image" value="<?php echo $r['image']; ?>" <?php if (isset($error) && empty($_POST['i'])) { ?> class="error" <?php } ?>/>

                <input type="submit" value="POST" class="submit save">
            </form>

            <br /><br />
            <small><a href="index.php">&larr; Back</a></small>
        </div>
    <?php include("../includes/footer.php"); ?>
<?php   
}
?>

您的
更新
语句错误。它不应该使用

$sql_update = 'UPDATE products SET product_name = :name, product_avail = :avail, product_price = :price, product_desc = :desc, image = :img WHERE product_id = :id';

在页面和SQL语句中添加错误检查会显示您的查询是错误的。始终在启用错误检查的情况下编码,并编码以删除错误。

与Jay的答案结合使用:

这是因为
if(isset($\u POST['submit']){
但您的提交按钮没有命名

<input type="submit" value="POST" class="submit save">

所以把它改成

<input type="submit" value="POST" class="submit save" name="submit">

您的条件语句依赖于它,并且该语句中的任何内容都不会因此而执行

但是,如果不更新,则如果确实要插入而不更新,则通过将
更新产品集
更改为
插入到产品中
,来执行和插入


在连接打开后立即添加
$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_EXCEPTION);
以捕获错误


旁注:错误报告只应在暂存阶段进行,而不应在生产阶段进行。

您易受攻击。为什么在其他查询中使用准备好的语句,而不是第一个
select*from products
query?更新没有值,它已设置;本周第二个。如果没有更新,请插入-
UPDATE products将
设置为
插入到产品中
很难说你想在这里做什么。他们去写一个,没有人费心去读。将MySQL文档添加到书签中,直到你完全了解它。@MarcB-谢谢你指出这一点。再次,我对这一切都很陌生。我会修复这一部分。非常感谢你指出它。我修改代码以反映您的更改,但这似乎不起作用。我将在页面中添加一些错误检查以查看结果。至少更新查询已修复:)…但大多数情况下都是在晚上,满月也将到来,呜呼!我的意思是…啊啊啊啊啊啊啊啊oouuuuhhh@danbeer我想我找到了答案(结合杰伊的答案),这
如果(isset($\u POST['submit']){
但是您的提交按钮没有命名为
,那么将其更改为
-您的条件语句依赖于它,并且该语句中的任何内容都不会因此而执行。我是否要将其设置为“答案”如果杰伊愿意让我把你变成一个了不起的人,你!天哪,犯了一个多么愚蠢的错误!再加上杰伊的补救措施,这一切都奏效了!我至少欠你们两个或三杯啤酒!@JayBlanchard谢谢杰伊。看起来很麻烦的是,结合你给出的答案,代码不起作用,所以我立即检查了条件语句和后变量是的,还有表单元素。我很高兴这一个问题得到解决,Cheers我已经检查了好几次,没有看到它。团队合作FTW!@JayBlanchard Team确实很好,而且它工作得相当好:)为了更好;)现在,如果我能想出一种方法,让表单值在保存后更新,而不必刷新页面。AJAX@danbeer-我愿意使用。在这一点上,你也会考虑模块化你的代码——HTML在一个文件中,PHP在另一个文件中,JavaScript/jQuery在另一个文件中。听起来我好像在写另一个博客,是吗,弗雷德?