【问题标题】:Something wrong with delete records删除记录有问题
【发布时间】:2013-10-18 16:05:57
【问题描述】:

我正在尝试解决从mysql删除记录的问题,请看代码

<?php 
 $dbcs = new mysqli("localhost", "root", "password", "database-name");

// Check connection
if (mysqli_connect_errno($dbcs))
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$product_list = "";
$sql = "SELECT * FROM product ORDER BY product_id DESC";

$result=mysqli_query($dbcs,$sql);

    while($row = mysqli_fetch_array($result)){ 

              $product_id = $row["product_id"];
              $product_name = $row["product_name"];
              $product_category = $row["product_category"];
              $product_retail_price = $row["product_retail_price"];
              $product_price = $row["product_price"];
              $product_detail = $row["product_detail"];
              $product_image = $row["screenshot"];
              $screenshot = $row["screenshot"];

              $product_list .= '<table width="80%" border="1">
    <tr>
    <td width="172" valign="top"> echo <img src="' . GW_UPLOADPATH . $screenshot .'" width="111" height="149" alt="<?php echo           $product_name; ?>" /><br /><a href="../product_images/<?php echo $product_id; ?>.jpg">View Full Size Image</a></td>
    <td width="85" class="product-text">' . $product_id . '</td>
    <td width="402" class="product-text">' . $product_name . '</td>
    <td width="108" align="center" class="product-text">' . $product_price . '</td>
    <td width="34" align="center" class="product-text"><a href="edit_product.php?pid=' . $product_id . '">Edit</a></td>
    <td width="56" align="center" class="product-text"><a  href="product.php?deleteid=' . $product_id . '">Delete </a></td>
    <td width="56" align="center" class="product-text"><a href="view_product.php?pid=' . $product_id . '">View</a></td>
    </tr>
    </table> ';

    }

    if (empty($product_list)) {
    $product_list = "You have no product listed in your data yet";
}
mysqli_close($dbcs);       

?>

然后这是php删除代码

<?php
/////////////////////////////////////////////////////////////////////////// 
// Delete Item Question to Admin, and Delete Product if they choose
///////////////////////////////////////////////////////////////////////////

if (isset($_GET['deleteid'])) {
    echo 'Do you really want to delete product with ID of ' . $_GET['deleteid'] . '? <a href="product.php?yesdelete=' . $_GET['deleteid'] . '">Yes</a> | <a href="product.php">No</a>';
    exit();
}
if (isset($_GET['yesdelete'])) {
//////////////////////////////////////////////////////////
// remove item from system and delete its picture
// delete from database
//////////////////////////////////////////////////////////

    $id_to_delete = $_GET['yesdelete'];
    $sql ("DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysql_error());

/////////////////////////////////////////////////////////////
// unlink the image from server
// Remove The Pic -------------------------------------------
/////////////////////////////////////////////////////////////

    $pictodelete = ("../product_images/$id_to_delete.jpg");
    if (file_exists($pictodelete)) {
                unlink($pictodelete);
    }
    header("location: product.php"); 
    exit();
}
?>

当我运行它以选择项目并按删除并按是删除时,我收到错误提示

Fatal error: Call to undefined function SELECT * FROM product ORDER BY product_id DESC() in C:\VertrigoServ\www\shopone\admin\data\product.php on line 131

他的意思是什么以及如何解决这个问题! 上午

【问题讨论】:

  • mysqli_query($sql,"DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysql_error());替换$sql ("DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysql_error());

标签: php database mysqli sql-delete records


【解决方案1】:

错别字:

  $sql ("DELETE FROM ...
      ^---missing =

您很容易受到SQL injection attacks 的攻击。在您了解问题以及如何避免该问题之前,请不要使用此代码。

【讨论】:

  • 嗯,是的。 [space](...) 被视为具有空白函数名的函数调用,这是 PHP 语法错误。函数必须有非空名称。
  • 我通过添加这个 $sql=mysql_query("SELECT * FROM product ORDER BY product_id DESC");但我仍然收到错误说 mysql_query() [<a href='function.mysql-query'>function.mysql-query</a>]:无法在 C:\ 中建立到服务器的链接VertrigoServ\www\shopone\admin\data\product.php 在第 74 行上线,这与我添加的同一行...这是什么意思以及如何解决这个问题!
  • 你在里面调用mysql_query而不是mysqli_query()(注意i)。这两个库不兼容,不能互换使用。
  • 运行此代码时没有出现语法错误:function sayboo() { /* Do something */ } $func_name = "sayboo"; $func_name ();
  • () 中添加一个参数。 $func_name ('foo') 会爆炸
【解决方案2】:

首先,您将字符串保存到变量$sql...

$sql = "SELECT * FROM product ORDER BY product_id DESC";

...然后你调用一个名称在变量$sql 中表示的函数。

$sql ("DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1")

您将变量用作函数。我猜你想使用函数mysqli_query()

【讨论】:

  • 很明显OP缺少一行代码来执行删除功能。这就是应该做的mysqli_query($sql,"DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysql_error());
【解决方案3】:

您正在使用$sql 之类的函数,因此 PHP 正在尝试使用其中的名称执行函数。

您必须使用mysql_query() 要求您的查询。

还可以考虑迁移到PDO,这比已弃用的mysql_* 更好(prepared statements 也值得学习)。

【讨论】:

    【解决方案4】:

    编辑:当时的评论太长了,我今天添加了一些其他细节。

    • mysql_error() 不与 mysqli_ api 混合使用。它需要读作mysqli_error($dbcs)

    我使用您的源代码在自己的网络服务器上创建了一个表,并得出以下结论。

    但首先,如果您的删除文件/函数位于单独的文件中,那么您将需要该文件中的数据库连接凭据,否则它将无法工作,除非您将其作为包含或全局设置。

    在你的情况下,它类似于:

    $dbcs = new mysqli("localhost", "root", "password", "database-name");
    
    mysqli_query($dbcs,"DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysqli_error($dbcs));
    

    替换:

    $sql ("DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysqli_error($dbcs));
    

    与:

    mysqli_query($sql,"DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysqli_error($dbcs));
    

    或者在你的情况下,它可能是:

    mysqli_query($dbcs,"DELETE FROM product WHERE product_id='$id_to_delete' LIMIT 1") or die (mysqli_error($dbcs));
    

    但是,这对 SQL 注入是开放的。最好为此使用准备好的语句。

    然而,如果$id_to_delete 始终是整数,您可以使用(int)

    即:

    $id_to_delete = (int)$_GET['yesdelete'];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2021-05-18
      相关资源
      最近更新 更多