【问题标题】:(PHP) No error, but no edit in mysql database [duplicate](PHP)没有错误,但在mysql数据库中没有编辑[重复]
【发布时间】:2017-06-13 03:52:40
【问题描述】:

我正在为学校创建一个出售动物的网站。我们需要有一个管理页面,使所有者能够在网站上添加、编辑和删除动物。我们使添加动物成为可能,但我似乎无法编辑现有的动物。我也没有真正的 PHP 经验。我添加了一些检查以查看语句是否正在执行,一旦我填写表格并单击提交,它就会告诉我“完成”,这应该意味着它有效 - 但表格保持不变。有人可以阐明我可能面临的问题吗?这是我第一次通过 SO 提问。

edit1:我没有尝试使用“where animal_id = ':animal_id'”,而是仅使用动物编号。 33,而不是我在表单中输入的值,它用':class'和':price'等替换了所有值。所以将表单值绑定到'insert into' stmt一定是错误的。

这是数据库连接

<?php

$server = 'localhost';
username = 'username';
$password = '*********';
$database = 'databasename';

$conn = new PDO("mysql:host=$server;dbname=$database;", $username,  $password);

?>

这是edit_animal文件:

<?php

session_start();

if( isset($_SESSION['user']) ){
  header("Location: /");
}

ini_set('display_errors', '0');   
error_reporting(E_ALL | E_STRICT);

require 'database.php';

$message = '';

 if(!empty($_POST['animal_name']) && !empty($_POST['official_name']) &&    !empty($_POST['average_lifespan']) && !empty($_POST['length']) && !empty($_POST['class']) && !empty($_POST['housing']) && !empty($_POST['animal_price']) && !empty($_POST['diet']) && !empty($_POST['description'])):

$sql = "UPDATE animal_test SET animal_name =':animal_name', animal_price =  ':animal_price', official_name =':official_name', average_lifespan = ':average_lifespan' , length =':length' , class =':class', housing = ':housing',  description=':description', diet =':diet' WHERE animal_id =':animal_id'";
  $stmt = $conn->prepare($sql);

  $stmt->bindParam(':animal_id', $_POST['animal_id']);
  $stmt->bindParam(':animal_name', $_POST['animal_name']);
  $stmt->bindParam(':official_name', $_POST['official_name']);
  $stmt->bindParam(':average_lifespan', $_POST['average_lifespan']);
  $stmt->bindParam(':length', $_POST['length']);
  $stmt->bindParam(':class', $_POST['class']);
  $stmt->bindParam(':housing', $_POST['housing']);
  $stmt->bindParam(':animal_price', $_POST['animal_price']);
  $stmt->bindParam(':description', $_POST['description']);
  $stmt->bindParam(':diet', $_POST['diet']);
  $result = $stmt->execute();

  if (!$stmt) {
    echo "Jammer";
  }
  if( $stmt){
   echo "done";
 }
 if ($result) {
  echo "done";
 }
  else{
    $message = 'Sorry there must have been an issue with editing your  animale';

}

endif;

?>

<!DOCTYPE html>
<html>
    <head>
        <title>Admin - Exotic Animal Shop</title>
        <link rel="stylesheet" type="text/css" href="admin_page.css">
    </head>
    <body>         

        <h2>Add a product</h2>

        <form action="<?php echo $_SERVER['PHP_SELF']; ?>"method="POST">



          <div class=add_product_div>

            <div id=animal_name_div>
              <p>Animal name</p>
              <input id=animal_name type="text" placeholder="Animal name" name="animal_name">
            </div>

            <div id=animal_id_div>
              <p>Animal ID</p>
              <input id=animal_id type="number" placeholder="Animal ID" name="animal_id" min="0">
            </div>

            <div id=price_div>
              <p>Price</p>
              <input id=animal_price type="number" placeholder="Price" name="animal_price" min="0">
            </div>

            <div id=official_name_div>
              <p>Official name</p>
              <input id=official_name type="text" placeholder="Official name" name="official_name">
            </div>

            <div id=current_age_div>
              <p>Average lifespan</p>
              <input id=average_lifespan type="text" placeholder="Average lifespan" name="average_lifespan">
            </div>
          </div>


          <div class=add_product_div>

            <div id=length_div>
              <p>Max length</p>
              <input id=length type="text" placeholder="Max length" name="length">
            </div>

            <div id=class_div>
              <p>Class</p>
              <input id=class type="text" placeholder="Class" name="class">
            </div>

            <div id=housing_div>
              <p>Housing</p>
              <input id=housing type="text" placeholder="Housing" name="housing">
            </div>

            <div id=animal_diet>
              <p>Diet</p>
              <input id=diet type="text" placeholder="Diet" name="diet">
            </div>
          </div>

            <div class=add_product_div>
              <p>Description</p>
              <textarea placeholder="Description" id="description" name="description" rows="20" cols="40"></textarea>
            </div>


            <div id=submit_div>
              <input id=submit type="submit" value="Submit">
            </div>

        </form>
        <form action="upload.php" method="post" enctype="multipart/form-data">
          <p>Select image to upload</p>
          <input type="file" name="userfile" id="userfile">
          <input type="submit" value="Upload Image" name="submit">
        </form>
</body>

【问题讨论】:

  • PDO默认不抛出异常,需要显式配置。
  • 不确定,但删除WHERE animal_id =':animal_id' 周围的引号,使其变为WHERE animal_id =:animal_id
  • 您不需要在查询中添加单引号 ($sql),而且看起来您有时添加了太多空格。此外,使用value = :myvalue 进行准备可以让您使用数组来执行。这些建议只会清除和减轻您的代码
  • @marmeladze 我试过了,但遗憾的是它不起作用,我也只收到一个“完成”的回声,我猜这意味着 stmt 没有执行。
  • PDO 错误处理在这里阅读-> phpdelusions.net/pdo#errors

标签: php html mysql pdo


【解决方案1】:

您准备好的语句不应在替换字段周围有“'”标记。

参见参考here

把它改成类似这样的东西:

$sql = "UPDATE animal_test SET animal_name =:animal_name, 
  animal_price =  :animal_price, official_name =:official_name, 
  average_lifespan = :average_lifespan , length =:length,
  class =:class, housing = :housing,  description=:description,
  diet =:diet WHERE animal_id =:animal_id";

另一种解决方案是使用位置占位符 ("?") 和 bindParam 按数字。见参考here

$sql = "UPDATE animal_test SET animal_name =?, 
  animal_price =  ?, official_name =?, 
  average_lifespan = ?, length =?,
  class =?, housing = ?,  description=?,
  diet = ? WHERE animal_id = ?";

$stmt->bindParam(1, $_POST['animal_name']);
$stmt->bindParam(2, $_POST['animal_price']);

... and so on

【讨论】:

  • 感谢您的回复。当我尝试这个时,我只得到一个“完成”,所以 $stmt 没有被执行。但是,当我不这样做时,我会在我的表中获取值 ':class'、':value' 等,而不是从表单中获取用户提交的信息。所以不知何故,放在文本字段中的信息没有保存..我现在试试你的第二个解决方案,一开始没看到。
  • 将“完成”打印中的一个更改为其他内容 - 很难知道您看到的是哪个。此外 - $stmt 将永远是“真” - 不是一个真正有用的测试。另外(再次) - 执行 var_dump($_POST) 以确保您从表单发送有效值。
  • 您的第二个解决方案;将 :values 更改为 '?'并订购 bindparams 似乎奏效了。非常感谢,你是个传奇。
  • k.最后一步 - 接受答案...并且一切顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-13
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
相关资源
最近更新 更多