2011-08-01 7 views
0

DBを介してスクリプトを検索し、壊れたリンクを修正します。検索と置換の機能はうまくいきますが、更新されたデータスクリプトを保存しようとすると、最初の未処理のデータだけが表示されます。私はこっそりしている!私は単純なmysql_queryコマンドを使ってデータを更新することができますが、PDOが必要です...PHP PDOはforeachループでレコードを更新できません

header('Content-Type: text/html; charset=UTF-8'); 
error_reporting(E_ALL); 
echo "Welcome"; 
$mysql = new PDO('mysql:host=localhost;dbname=db_name;charset=UTF-8','user','12345'); 
if (!$mysql) die('Can\'t connect'); 

$tables = array(
    'categories', 
    'news', 
    'pages' 
); 

function getContent($table) { 
    global $mysql; 
    $fieldnum = 0; 
    $fields = array(); 
    $vals = array(); 
    $st = $mysql->query("SHOW FIELDS FROM `{$table}`"); 
    while ($row = $st->fetch(PDO::FETCH_ASSOC)) { 
     $fields[$fieldnum]=$row["Field"];  
     $fieldnum++; 
    } 
    $totalfields=$fieldnum; 
    $res = $mysql->query("SELECT * FROM `{$table}`"); 
    $sql = "UPDATE `:table` SET :field = ':val' WHERE `:idf` = :id;";  
    while ($row = $res->fetch(PDO::FETCH_NUM)) { 
     for ($j=0; $j<$res->columnCount();$j++) {     
      $rs = str_replace('index.php/','',$row[$j],$m); 
      if ($rs && $m>0) { 
       if ($table == 'categories') 
       $prim= 'cat_id'; 
       elseif($table == 'news') $prim= 'news_id'; 
       elseif($table == 'pages') $prim= 'page_id'; 
       else $prim= $table.'_id'; 

          $upd = $mysql->prepare($sql); 
       $update = $upd->execute(array(
       ':table'=>$table, 
       ':field'=>$fields[$j], 
       ':val'=>$rs, 
       ':idf'=>$prim, 
       ':id'=>$row[0] 
       ));    
      } 
     } 
    } 
} 

foreach ($tables as $t) { 
    getContent($t); 
} 

修正するのに手助けが必要です!一度だけExample #2

.... 
$res = $mysql->query("SELECT * FROM `{$table}`"); 
$rows = $res->fetchAll(PDO::FETCH_NUM); 
$sql = "UPDATE `:table` SET :field = ':val' WHERE `:idf` = :id;"; 
$upd = $mysql->prepare($sql);   
foreach ($rows as $row) { 
    foreach ($row as $col_name => $value) {   
...... 
+0

間違いはありますか? – Subdigger

+1

'$ mysql = new PDO( 'mysql:host = localhost; dbname = db_name; charset = UTF-8)行の後に' $ mysql-> setAttribute(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_EXCEPTION);を追加できますか? '、' user '、' 12345 '); 'それが何を言っているのか教えてください。 – Arkh

+0

@Zhlobopotam私はこの問題を長年前に受けており、pdoは2つのオープンされたクエリをサポートしたくありません...最初に閉じるか、fetchAllを他のものと操作する必要があります – Subdigger

答えて

1

は、すべてを取得し、その後、アレイ を通過しようとすると、あなたはすべての時間を準備使用する必要はありません!この方法で値を失っている場合は、$ upd-> debugDumpParams()も試してみてください。実行前のバインディングは、バインディングの値が正しくない可能性があります。

-1

は、ループの外に準備を参照 -

関連する問題