【问题标题】:mysql DELETE query failing, using implode IN clausemysql DELETE 查询失败,使用 implode IN 子句
【发布时间】:2012-08-01 09:10:24
【问题描述】:

我目前正在使用复选框填充数组,将数组变量内爆并在 DELETE 函数的 IN 子句中使用该变量。 var_dump 显示我正在创建一个正确的查询,但我无法进行任何删除。这是解决我一个月左右的现有问题的新方法。

这就是我所拥有的。

//Connect to the db
$id_array = NULL;

// Make the query to display user's uploads
 $q = "SELECT upload_id, title, genre, length, created, views
        FROM upload
        WHERE owner_id =". $_SESSION['user_id'] ."
        ORDER BY title ASC";


$r = mysqli_query ($dbc, $q); // Run the query

if($r)
    {
        // If it ran okay, display the records
        echo '<table align="center"
            cellspacing="3" cellpadding="3"
            width="75%">
           <tr><td align="left"><b>Title</b></td>
           <td align="left"><b>Genre</b></td>
           <td align="left"><b>Pages</b></td>
           <td align="left"><b>Submitted</b></td>
           <td align="left"><b>Views</b></td>
           </tr>';

        // Fetch and print all the records:
?><form action="/nbproject/newwriter_profile.php" method="post">
<?php
  while ($row = mysqli_fetch_array($r,MYSQLI_ASSOC))
    {
       echo '<tr><td align="left">' .
       $row['title'] . '</td><td align="left">'
       . $row['genre'] . '</td><td align="left">'
       . $row['length'] . '</td><td align="left">'
       . $row['created'] . '</td><td align="left">'
       . $row['views'] . '</td><td align="left">' //. var_dump($row) //dump row value for testing
       . '<input type="checkbox" name="checkbox[]"  value= "'.$row['upload_id'].'"'.' />'.' </td>'. '</tr>';
    }
   echo '</table>'; // Close the table
        ?>

上面的代码创建了一个简单的表格,每条记录都有一个对应的复选框,勾选删除然后点击“删除”

         <input type="submit" name="delete" value="Delete" align="right"/> 
       </form>

<?php
   } // End of if ($r) IF.
    mysqli_close($dbc); // Close the database connection

自定义删除功能:

function submit_delete() {
  if(!is_null($_POST['delete']) && !is_null($_POST['checkbox'])) { //Check to see if a delete command has been submitted.
    //This will dump your checkbox array to your screen if the submit works.
    //You can manually check to see if you're getting the correct array with values
   // var_dump($_POST['checkbox']);//Comment this out once it's working.
    $id_array = $_POST['checkbox'];
    $id_array = array_map('intval', $id_array);
    $id_array = array_unique($id_array);
    $id_array = implode(',',$id_array);
    //var_dump($id_array);
    deleteUploads($id_array);

  }
  else {
    echo "Error: submit_delete called without valid checkbox delete.";//var_dump($_POST['checkbox']);
  }
}

$delete_success = false;
function deleteUploads ($id_array) {
    require_once(my connection to db);

    mysqli_free_result($r);

  if (count($id_array) <= 0) {   echo "Error: No deletes in id_array!"; echo 'wtf'; }

  //var_dump($id_array);

上面的 var dump 显示正确的 id,如我的 mysql 数据库中所示

    $gone = "DELETE  FROM `upload` WHERE `upload_id` IN ("."$id_array".")";
    var_dump($gone);

上面的 var 验证查询格式是否正确,用逗号分隔 id

    $goodbye = mysqli_query($dbc, $gone);

    if ($goodbye) { $delete_success = true; var_dump($delete_success);}
    else { $delete_success = false;}
    var_dump($delete_success);

上面的 var dump 显示 bool false

    //mysqli_close($dbc);
    if($delete_success == true) { echo 'done';
    header('Location: newwriter_profile.php');
  } else
      {
    echo "Error b/c delete failed";

上面的回显是在选中任意数量的框并点击删除后显示的

      }

  }


submit_delete();

mysqli_free_result($goodbye);
mysqli_close($dbc);


?> 

【问题讨论】:

  • 那么您是否致电mysqli_error() 来查看问题所在?如果返回 FALSE,则说明您的查询有问题,或者您没有连接到数据库。
  • 只是为了确定,数据库中的integer 类型的属性upload_idvarchar,而不是varchar
  • 我无法使用 mysqli_error() 获得任何输出。而 pEkvo,upload_id 在我的数据库中是 mediumint - 我认为这可能是问题
  • 能否请您提供 $gone = "DELETE FROM upload WHERE upload_id IN ("."$id_array".")";在浏览器上回显后。
  • 这是选中 2 个框后回显的内容,id 与 mysql 数据库中的记录匹配: string(50) "DELETE FROM upload WHERE upload_id IN (20,19)" bool( false) 错误 b/c 删除失败。 - 我需要更改查询以转换为 INT 吗?数据库字段是 mediumint 并且它会自动递增。

标签: php mysql arrays checkbox implode


【解决方案1】:

来自您的代码:

$id_array = implode(',',$id_array);        //-> You convert array into string.
//var_dump($id_array);
deleteUploads($id_array);                  //-> Call function for delete with string parameter.

在您的删除函数代码中,您计算​​字符串参数($id_array):

if (count($id_array) <= 0) { ...

从删除函数内部剪切你的代码:

if (count($id_array) <= 0) {   echo "Error: No deletes in id_array!"; echo 'wtf'; }

并在将数组转换为字符串之前插入:

$id_array = array_unique($id_array);
if (count($id_array) <= 0) {   echo "Error: No deletes in id_array!"; echo 'wtf'; }
$id_array = implode(',',$id_array);
//var_dump($id_array);
deleteUploads($id_array);

【讨论】:

  • 我做了这个改变。我仍然无法删除。我相信问题在于我的数据库记录 id 是 mediumint 而我的查询正在传递一个字符串。
  • 好吧,试着改变你的删除查询: $gone = "DELETE FROM upload WHERE upload_id IN ("."$id_array".")"; into $gone = "DELETE FROM upload WHERE upload_id IN ({$id_array})";
  • 这是我当前的 DELETE 查询:$gone = "DELETE FROM upload WHERE upload_id IN ({$id_array})";它在屏幕上回显以下内容: string(50) "DELETE FROM upload WHERE upload_id IN (20,19)" bool(false) Error b/c delete failed
【解决方案2】:

我解决了我的问题。我意识到,在我随意的开发过程中,在实际创建上传表之前,我已经创建了具有相关权限的数据库用户。我对我的数据库用户运行了一个授予权限语句,并且奇迹般地我能够使用上面的代码删除。这也解决了我在页面之间丢失 SESSION 变量时遇到的另一个问题。

这绝对是一场噩梦——我希望这对其他人也有帮助。感谢您的意见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多