2014-07-20 105 views
-1
<?php 
$db = new PDO('mysql:host=localhost;dbname=wordpress', 'root',''); 
//---------prepare 
$delete3 = $db->prepare("DELETE FROM wp_term_relationships WHERE object_id=:id"); 
$delete2 = $db->prepare("DELETE FROM wp_posts WHERE ID=:id"); 
$delete = $db->prepare("DELETE FROM wp_postmeta WHERE post_id=:id");; 
$select = $db->prepare("SELECT post_id FROM reference WHERE x_id=?"); 
$delete->bindParam(':id', $id, PDO::PARAM_STR); 
$delete2->bindParam(':id', $id, PDO::PARAM_STR); 
$delete3->bindParam(':id', $id, PDO::PARAM_STR); 
//---------- 
echo 'conected-----'; 
{$delfeed = 'LOTS OF NUMBERS';} 
$array = explode(',',$delfeed); 
foreach($array as $deadman){ 
    $select->execute(array($deadman)); 
    $row = $select->Fetch(PDO::FETCH_ASSOC); 
    $id = $row['post_id']; 
     if ($id){ 
     echo "$id"."\n"; 
     $delete->execute(); 
     $delete2->execute(); 
     $delete3->execute(); 
}} 
echo 'done!'; 
?> 

其简单删除脚本,但它不删除,它打印正确的$ id的女巫意味着正在工作,直到有但删除云香蕉,双重检查表名,colums ... tryied与问号占位工作insted的绑定参数,但没有 更新的:它粘在阵列中的foreachPDO删除不工作

回答

2

问题的第一个项目是,你设置$id变量是有史以来之前。

<?php 
$db = new PDO('mysql:host=localhost;dbname=wordpress', 'root',''); 

$delete3 = $db->prepare("DELETE FROM wp_term_relationships WHERE object_id=?"); 
$delete2 = $db->prepare("DELETE FROM wp_posts WHERE ID=?"); 
$delete = $db->prepare("DELETE FROM wp_postmeta WHERE post_id=?"); 
$select = $db->prepare("SELECT post_id FROM reference WHERE x_id=?"); 

foreach($array as $deadman){ 
    $select->execute(array($deadman)); 
    $row = $select->Fetch(PDO::FETCH_ASSOC); 
    $id = $row['post_id']; 
    if ($id) { 
     echo "$id"."\n"; 
     $data = array($id); 
     $delete->execute($data); 
     $delete2->execute($data); 
     $delete3->execute($data); 
    } 
    $id++; 
} 
echo 'done!'; 
?> 

我没有更新你的代码一点点,因为一些位没有意义,如$delfeed是一个空字符串,增加,即使它被覆盖了$id变量,且放置随意左右大括号。但正如你所看到的,在if($id)的检查中,我将变量绑定在那里。

除了使用我的方法,您可以指定文档顶部的变量$id为值0;然后,在完成所有准备说明之后,您可以使用功能bindParam而不是bindValue

$id = 0; 

// Prepare Statements 

$delete->bindParam(':id', $id, PDO::PARAM_STR); 
$delete2->bindParam(':id', $id, PDO::PARAM_STR); 
$delete3->bindParam(':id', $id, PDO::PARAM_STR); 

// Rest of Original Code With No Changes 

这部作品的原因,是因为bindParam经过在查询执行时间参考。见PHP bindParam Document以及this answer.

编辑:解决方案的2个固定的foreach问题

<?php 
$db = new PDO('mysql:host=localhost;dbname=wordpress', 'root',''); 

$delete3 = $db->prepare("DELETE FROM wp_term_relationships WHERE object_id=:id"); 
$delete2 = $db->prepare("DELETE FROM wp_posts WHERE ID=:id"); 

// Had a double semicolon trailing the function. Removed one of them 
$delete = $db->prepare("DELETE FROM wp_postmeta WHERE post_id=:id"); 
$select = $db->prepare("SELECT post_id FROM reference WHERE x_id=?"); 

$id = 0; // Define Variable BEFORE bindParam 

$delete->bindParam(':id', $id, PDO::PARAM_STR); 
$delete2->bindParam(':id', $id, PDO::PARAM_STR); 
$delete3->bindParam(':id', $id, PDO::PARAM_STR); 


$delfeed = ''; // Why Have Curly Braces around this? 

$array = explode(',',$delfeed); 

foreach($array as $deadman) { 
    $select->execute(array($deadman)); 
    $row = $select->Fetch(PDO::FETCH_ASSOC); 
    $id = $row['post_id']; 
    if ($id){ 
     echo "$id"."\n"; 
     $delete->execute(); 
     $delete2->execute(); 
     $delete3->execute(); 
    } 
} 
echo 'done!'; 
?> 
+0

facepalmed自己的辛苦,它掠过我的脸 - ”谢谢哥们 – user3610512

+0

如果你还没有,检查的最底部我添加了关于使用'bindParam'的帖子。它可能会使代码更容易更新。 – David

+0

不错!但现在它陷入了foreach,$ delfeed充满了数字我只是把它们拿出来,所以代码不会太长 – user3610512