【问题标题】:What is wrong about this SQL statement? [closed]这个 SQL 语句有什么问题? [关闭]
【发布时间】:2013-07-23 19:48:13
【问题描述】:

这是包含的 PHP 文件:

<?php
session_start();
include("../includes/dbcxnfunction.inc");

$billid = $_POST['billid'];
$userid = $_SESSION['userid'];

$query = "IF EXISTS ( SELECT * FROM favoritebills WHERE userid = '$userid' AND billid = '$billid' )
              DELETE FROM favoritebills WHERE userid = '$userid' and billid = '$billid'         
          ELSE
              INSERT INTO favoritebills (userid,billid) VALUES($userid,$billid) ";

$result = mysqli_query(dbcxn('bill'),$query)
              or exit("Couldn't execute query for favorites");

if($result)
    {
    $request = "true";
    }
else 
    {
        $request = "false";
    }

echo $request;

?>

查询是:

"IF EXISTS ( SELECT * FROM favoritebills WHERE userid = '$userid' AND billid = '$billid' )
          DELETE FROM favoritebills WHERE userid = '$userid' and billid = '$billid'         
      ELSE
          INSERT INTO favoritebills (userid,billid) VALUES($userid,$billid) ";

userid 和 billid 都是整数。

这是我的网络标签:

在我的 .js 文件中,我有 console.log(response);

控制台正在记录“无法执行收藏夹查询”

【问题讨论】:

  • 我经常看到这种类型的问题,你应该阅读common database debugging for PHP and MySQL
  • 这不是查询,而是语句。它只能用作存储过程的一部分。
  • 加油!您没有提到任何错误消息,没有意外行为,什么都没有。我们注定要通灵吗?
  • 我得到的唯一错误消息是我在 mysqli_query() 的“或 exit()”中设计的错误消息唯一的意外行为是查询不起作用。
  • 您没有收到详细的错误消息,因为您从未致电 mysqli_error() 来查看失败的原因。

标签: php sql


【解决方案1】:

您不能在查询中使用IF 作为语句,它只能在存储过程中使用。要执行您想要的操作,您需要两个单独的查询。试试这个:

$del_query = "DELETE FROM favoritebills WHERE userid = '$userid' and billid = '$billid'";
$ins_query = "INSERT INTO favoritebills (userid,billid) VALUES($userid,$billid) ";

$res = mysqli_query(dbcxn('bill'),$del_query)
  or die ("Couldn't execute DELETE query: " . dbxcn('bill')->error);
if (dbcxn('bill')->affected_rows == 0) { // The row didn't exist, so add it
  $res = mysqli_query(dbcxn('bill'),$ins_query)
    or die ("Couldn't execute INSERT query: " . dbxcn('bill')->error);
}

$result = "true"; // No need to test for false, since we die above in that case

【讨论】:

  • 使用准备好的语句可能更好
  • 是的,我只是不想做那么多重写。
  • 通知:试图在/opt/lampp/htdocs/unipartisan/ajaxphp/favorites.php中获取非对象属性13
  • 所以它返回 true,并且查询正在执行,它似乎不喜欢 $res->num_rows 出于某种原因。
  • 删除,dbcxn('bill')-&gt;affected_rows
【解决方案2】:

您是否意识到,如果记录存在,您会消除它们而不留下任何东西? 仅当记录不存在时才会插入。

不要试图将它们结合起来, 运行 2 个查询, 从哪里删除 然后 插入

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 2011-08-28
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2011-04-17
    相关资源
    最近更新 更多