• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

аналог Sql-евого Update на Php

  • Автор темы Lucky.NET
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

Lucky.NET

привет. вопрос по пхп: привожу код с коментами
в двух словах есть некие данные в дбф-файле. цель - заменить даные первого поля (номерация запесей) масивом [1,2,3...dbase_numrecords($dbf))]
// перенумеровуeмо поточну базу даних

// откриваем файл RW - режим = "2"
$dbf = dbase_open($dbname,2);
$n = dbase_numrecords($dbf);
// крутим цикл от 1 до "кол-во рекордов в базе"
for($cntr=1;$cntr<$n;$cntr++){
// берём і-тий рекорд
$row = dbase_get_record($dbf, $cntr);
// ..меняем в ньом первий елемент масива на і-тий
unset($row[0]);
$row[0] = $cntr." ";
// делаем реплейс..
dbase_replace_record($dbf,$row,$cntr) or die("replase is not complit<br>\n");
// и не работает! - видаёт replase is not complit

виндовс ХР. пхп вершн - 4.3.11 . поддержка dbase - есть... а dbase_replace_record() - неработает.
руки опускаются..
заранее благодарен
 
A

Andrew Stephanoff

а dbf - формат позволяет выполнять команды SQL? если да, то возможно лучше через SQL-команду обновлять..
--
возможно переменная $row принимает в себя не массив, а строку из элементов, которую нужно преобразовать в массив через explode()
 
A

admin

Для: Andrew Stephanoff
<!--QuoteBegin-Andrew Stephanoff+20:06:2005, 08:31 -->
<span class="vbquote">(Andrew Stephanoff @ 20:06:2005, 08:31 )</span><!--QuoteEBegin-->а dbf - формат позволяет выполнять команды SQL? если да, то возможно лучше через SQL-команду обновлять..
[snapback]21319" rel="nofollow" target="_blank[/snapback]​
[/quote]
насколько я знаю не может.
но с dbf не работал серьезно никогда
 
A

Andrew Stephanoff

посмотрел еще раз..
dbase_get_record() взвращает массив, так что тут все ок..
1) for($cntr=1;$cntr<$n;$cntr++) -- неверно, поледнюю запись не обработает, надо for($cntr=1;$cntr<=$n;$cntr++);
2)
// ..меняем в ньом первий елемент масива на і-тий
unset($row[0]);
$row[0] = $cntr." ";
// делаем реплейс..
dbase_replace_record($dbf,$row,$cntr) or die("replase is not complit<br>\n");
а если первое поле является численным? ты в него подставляешь строку $cntr." ", но, возможно, там необходимо хранить только числовые значения поля, проверь..
 
C

coba

Тут все просто - просто в массиве есть лишнее поле 'deleted', чтобы его убрать делать надо так:
<?php

// open in read-write mode
$db = dbase_open('/tmp/test.dbf', 2);

if ($db) {
// gets the old row
$row = dbase_get_record_with_names($db, 1);

// remove the 'deleted' entry
unset($row['deleted']);

// Update the date field with the current timestamp
$row['date'] = date('Ymd');

// Replace the record
dbase_replace_record($db, $row, 1);
dbase_close($db);
}

?>
 
L

Lucky.NET

dbf-формат позволяет работать со стандартными скл-запросами, но посредством ОДБС - создавая DSN. но етот вариант меня не устраивает. последний пост полностю решает мою проблему, за что и благодарен :D
 
L

Lucky.NET

Тут все просто - просто в массиве есть лишнее поле 'deleted', чтобы его убрать делать надо так:
$row = dbase_get_record_with_names($db, 1);
unset($row['deleted']);

а я делал так
$row = dbase_get_record($dbf, $cntr);
unset($row[0]);
- по сути - это одно и тоже, тока твой вариант - именованое обращение, мой - нумерованое
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!