Архив рубрики: PHP

Работа с транзакциями MySQL на PHP

С часа три вероятно мучался вчера, пока подобрал вариант кода, который корректно отрабатывает.

$err="";
 $lb=new Tsql();
 $lb->connect($myrow["host"], $myrow["username"], $myrow["pass"], $myrow["basename"]);
 $lb->start_transaction();
 $sql="INSERT INTO payments (agrm_id,amount,comment,receipt,pay_date,local_date,status,mod_person,amount_cur) VALUES ('$agrm_id','$amount','Автоматически загруженный платеж','$uniid','$dat',now(),0,'$manager_id','$amount')";
 if ($err==""){
 $result2 = $lb->ExecuteSQL($sql);
 if ($result2=='') {$err="Error!";};
 };
 $sql="UPDATE agreements SET balance=balance+$amount where agrm_id='$agrm_id'";
 if ($err==""){
 $result2 = $lb->ExecuteSQL($sql);
 if ($result2=='') {$err="Error!";};
 };
 if ($err==""){
 $lb->commit();
 } else {
 $lb->rollback();
 PutLog('----ошибка занесения платежа(2): ' . $err);
 };
 unset($lb);

Использованный класс:

<?php
// Данный код создан и распространяется по лицензии GPL v3
// Изначальный автор данного кода - Грибов Павел
// http://грибовы.рф

class Tsql {
    var $idsqlconnection; // идентификатор соединения с БД

// соеденяемся с БД и выбираем таблицу, получаем $idsqlconnection    
function connect($host,$name,$pass,$base){
    global $codemysql;
      $this->idsqlconnection=new mysqli($host,$name,$pass,$base);
        if (mysqli_connect_errno()) {
            $serr=mysqli_connect_error();
            die("Error connect to Mysql or select base: $serr");
            }      
    $result = mysqli_query($this->idsqlconnection,"SET NAMES $codemysql");    
    mysqli_set_charset($this->idsqlconnection, "$codemysql");
    
 }   
 
function ExecuteSQL($sql){
    //echo "$sql<br>";
    $result = mysqli_query($this->idsqlconnection,$sql);               
    if ($result==""){echo mysqli_connect_error();};
    return $result;
 }   
 
 function start_transaction(){
     return mysqli_query($this->idsqlconnection,"START TRANSACTION");
   //return mysqli_begin_transaction($this->idsqlconnection);  
 }
 
 function commit (){
     return mysqli_query($this->idsqlconnection,"COMMIT");
   //return mysqli_commit($this->idsqlconnection);  
 }
 
 function rollback(){
     return mysqli_query($this->idsqlconnection,"ROLLBACK");
   //return mysqli_rollback($this->idsqlconnection);  
 }
 function close(){
 return mysqli_close($this->idsqlconnection);
 }
}

Как оказалось, главной фишкой — нельзя использовать внутри цикла begin transaction — commit (или rollback) обработку ошибок при помощи mysqli_error — PHP падает в FATAL ERROR.. Почему? Вопрос интересный.

Работа с JSON в PHP

JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.

Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования. Для многих языков существует готовый код для создания и обработки данных в формате JSON.

Практическая польза использования JSON открывается при использовании технологии AJAX. Формат JSON является более кратким и удобочитаемым по сравнению с XML, является «родным» для Javascript. Кроме того, в JSON-код возможна вставка вполне работоспособных функций. Читать далее Работа с JSON в PHP

Дерево на jquery с «drag and drop»

Для того чтобы организовать хранение дерева, массив данных должен содержать как минимум два параметра: id записи, и child — т.е. в иерархии к какой id относится эта запись. Пример child =0, если запись в «корне». Например структура в mysql в простейшем случае может быть такой: id,name,address,child

Для непосредственного отображения дерева удобно пользоваться jquery плагином dynatree. При перетаскивании элементов дерева при помощи «drag and drop», состояние ветвей записывается в БД. Ниже пример кода, какой он может быть: Читать далее Дерево на jquery с «drag and drop»

Пример реализации прогресса на WEB странице

Задача: показать прогресс..ну например отправки большого количества СМС.

//запускаю таймер с периодическим срабатыванием
          var timer = setInterval(function() {
            //  отображаю прогрессбар                

$("#list2").load('predplatsmssendprogress.php?orgid='+defaultorgid+"&blibase="+$("#blibase").val()+"&grp="+$("#grp").val());                                
            }, 2000);
            // запускаю рассылку СМС
            smstxt=$("#smstext").val();
            $.get("smssend.php?orgid="+defaultorgid+"&blibase="+$("#blibase").val()+"&grp="+$("#grp").val(), { smstxt: smstxt} , function(data){                
                clearInterval(timer);
// рисуем что всё ок
                alert("Работу закончил хозяин");            
            });