PHP PDO не может обновлять записи в цикле foreach - PullRequest
0 голосов
/ 01 августа 2011

Скрипт поиска по БД и исправления неработающих ссылок. Функциональность поиска и замены работает нормально, но при попытке сохранить обновленные данные скрипты запускаются только первыми. Я застрял! Я могу использовать простые команды mysql_query для обновления данных, но требуется PDO ...

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);
}

Нужна помощь, чтобы исправить это!

Ответы [ 2 ]

1 голос
/ 01 августа 2011

попробуйте получить все и затем пройти через массив, и вам не нужно каждый раз использовать приготовление - просто один раз смотрите Пример # 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 голосов
/ 01 августа 2011

готовить вне цикла!таким образом вы теряете его значение, также попробуйте $ upd-> debugDumpParams ();и привязка перед выполнением, может быть, значения urinding не верны.

...