PHP 删除查询不起作用,甚至没有收到任何错误消息
PHP Delete Query is Not working and even not getting any error message
我想从 mst_user table 中删除我的用户。但删除查询不起作用它显示用户已删除但未从数据库中删除的消息。
这是Users.php
include("database.php");
$rs = mysql_query("select * from mst_user ORDER BY user_id ASC")
or die(mysql_error());
echo "<h1 align=center>Users Detail</h1>";
<table border="1" align="center" class='table'>
<tr>
<th align="center"> ID Number </th>
<th align="center"> Email </th>
<th align="center"> Username </th>
<th align="center"> Delete User</th>
</tr>
<?php
while ($row = mysql_fetch_array($rs)) {
?>
<tr>
<td align=center> <?php echo $row['user_id']?> </td>
<td align=center> <?php echo $row['email']?> </td>
<td align=center> <?php echo $row['username']?> </td>
<td aling=center"><a href="delete.php?user_id=<? echo
$row['user_id'];?>"><img src="image1/delete.png"></a> </td></tr>
<?php
}
echo "</table>";
}
?>
这是Delete.php
$user_id=$_GET['user_id'];
include "database.php";
$sql="delete from mst_user where user_id='$user_id'";
$result="mysql_query($sql)" or die("error");
if($result){
echo "<h3>User has been Deleted</h3>";
}
else{
echo "not delete";
}
?>
这一行是问题所在:
$result="mysql_query($sql)" or die("error");
应该是
$result=mysql_query($sql) or die("error");
你用引号把它变成了一个字符串。
也像其他人所说,mysql_* 已弃用,请改用 PDO 或 MySQLi。
PDO 示例和问题的解决方案
PDO
进一步更新您的代码:PDO 是一种更安全的查询方式。 mysql
查询已弃用。它们不应该再被使用了。
用以下代码替换您的数据库调用:
function openDBConnection()
{
$name = "xxxxxx";
$pw = "xxxxxx";
$server = "xxxxxxx";
$dbConn = new PDO("mysql:host=$server;dbname=xxx", $name, $pw, , array( PDO::ATTR_PERSISTENT => false));
}
catch( PDOException $Exception )
{
echo "Unable to connect to database. ";
}
return $dbConn;
}
function doPDOQuery($sql, $type, $var = array())
{
$db = openDBConnection();
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
if ($type == "prepare")
{
$queryArray = $var;
$sth = $db->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute($queryArray);
}
else if ($type == "query")
{
$sth = $db->query($sql);
}
else
{
echo "Supplied type is not valid.";
exit;
}
if (!$sth)
{
$error = $db->errorInfo();
echo $error;
exit;
}
return $sth;
}
您可以使用这些函数对数据库进行 PDO 查询。第一个函数打开数据库连接,而第二个函数实际执行查询。您不需要调用第一个函数。它在第二个中被调用。
基于您的代码的示例:
$sql = "delete from mst_user where user_id= :id"
$sql_result = doPDOQuery($sql, 'prepare', array(":id" => $user_id));
if ($row = $sql_result->rowCount() > 0 )
{
echo "<h3>user was deleted.</h3>";
}
PDO 的工作方式如下:PDO 不是将 php 变量传递到 SQL 字符串(并冒着 SQL 注入的风险),而是传递 SQL 字符串和变量到数据库,让数据库的驱动程序构建查询字符串。
PDO 变量可以按名称或按索引声明:
- 按名称:使用
:
声明命名变量。 SELECT * FROM TABLE WHERE id = :id
。每个密钥必须是唯一的。
- 按索引:使用
?
声明一个索引变量。 SELECT * FROM TABLE WHERE id = ?
需要将包含变量的数组传递给 PDO。
命名数组:
array(":id" => 1);
索引数组:
array(1);
使用命名数组,您不必担心变量的顺序。
使用 fetch
或 fetchAll
函数检索结果。 fetch
returns 一行。而 fetchAll
returns 一个包含所有行的数组。
我想从 mst_user table 中删除我的用户。但删除查询不起作用它显示用户已删除但未从数据库中删除的消息。
这是Users.php
include("database.php");
$rs = mysql_query("select * from mst_user ORDER BY user_id ASC")
or die(mysql_error());
echo "<h1 align=center>Users Detail</h1>";
<table border="1" align="center" class='table'>
<tr>
<th align="center"> ID Number </th>
<th align="center"> Email </th>
<th align="center"> Username </th>
<th align="center"> Delete User</th>
</tr>
<?php
while ($row = mysql_fetch_array($rs)) {
?>
<tr>
<td align=center> <?php echo $row['user_id']?> </td>
<td align=center> <?php echo $row['email']?> </td>
<td align=center> <?php echo $row['username']?> </td>
<td aling=center"><a href="delete.php?user_id=<? echo
$row['user_id'];?>"><img src="image1/delete.png"></a> </td></tr>
<?php
}
echo "</table>";
}
?>
这是Delete.php
$user_id=$_GET['user_id'];
include "database.php";
$sql="delete from mst_user where user_id='$user_id'";
$result="mysql_query($sql)" or die("error");
if($result){
echo "<h3>User has been Deleted</h3>";
}
else{
echo "not delete";
}
?>
这一行是问题所在:
$result="mysql_query($sql)" or die("error");
应该是
$result=mysql_query($sql) or die("error");
你用引号把它变成了一个字符串。
也像其他人所说,mysql_* 已弃用,请改用 PDO 或 MySQLi。
PDO 示例和问题的解决方案
PDO
进一步更新您的代码:PDO 是一种更安全的查询方式。 mysql
查询已弃用。它们不应该再被使用了。
用以下代码替换您的数据库调用:
function openDBConnection()
{
$name = "xxxxxx";
$pw = "xxxxxx";
$server = "xxxxxxx";
$dbConn = new PDO("mysql:host=$server;dbname=xxx", $name, $pw, , array( PDO::ATTR_PERSISTENT => false));
}
catch( PDOException $Exception )
{
echo "Unable to connect to database. ";
}
return $dbConn;
}
function doPDOQuery($sql, $type, $var = array())
{
$db = openDBConnection();
$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
if ($type == "prepare")
{
$queryArray = $var;
$sth = $db->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute($queryArray);
}
else if ($type == "query")
{
$sth = $db->query($sql);
}
else
{
echo "Supplied type is not valid.";
exit;
}
if (!$sth)
{
$error = $db->errorInfo();
echo $error;
exit;
}
return $sth;
}
您可以使用这些函数对数据库进行 PDO 查询。第一个函数打开数据库连接,而第二个函数实际执行查询。您不需要调用第一个函数。它在第二个中被调用。
基于您的代码的示例:
$sql = "delete from mst_user where user_id= :id"
$sql_result = doPDOQuery($sql, 'prepare', array(":id" => $user_id));
if ($row = $sql_result->rowCount() > 0 )
{
echo "<h3>user was deleted.</h3>";
}
PDO 的工作方式如下:PDO 不是将 php 变量传递到 SQL 字符串(并冒着 SQL 注入的风险),而是传递 SQL 字符串和变量到数据库,让数据库的驱动程序构建查询字符串。
PDO 变量可以按名称或按索引声明:
- 按名称:使用
:
声明命名变量。SELECT * FROM TABLE WHERE id = :id
。每个密钥必须是唯一的。 - 按索引:使用
?
声明一个索引变量。SELECT * FROM TABLE WHERE id = ?
需要将包含变量的数组传递给 PDO。
命名数组:
array(":id" => 1);
索引数组:
array(1);
使用命名数组,您不必担心变量的顺序。
使用 fetch
或 fetchAll
函数检索结果。 fetch
returns 一行。而 fetchAll
returns 一个包含所有行的数组。