• 14 odgovora
  • 4.525 pregleda
Baza MariaDB REST servis u PHP 05.04.2018. u 12:15 · pre 104 meseci #1
REST servis puni tabelu MASINE hteo bih da se odmah podaci razdvajaju u vise tabela M1 ,M2, .... M10 pokusao sam to da uradim sa trigerima ali MariaDB ne podrzava multiple triggers . Na koji nacin organizovati da resenje bude optimalno jer u pitanju je web server instaliran na PI RASPBERRY a ocekivani broj zapisa je do 200000 i to bih podelio na vise manjih tabela .
Re: Baza MariaDB REST servis u PHP 05.04.2018. u 13:29 · pre 104 meseci #2
Ne bi bilo lose da malo pojasnis to sto radis, tipa moze li taj servis da se izmeni, moze li da se ubaci stored procedura, mora li Maria....

Iz ovoga sto si dao kao informacije i requirements, mozda da stavis partitioning, po primarnom kljucu?
Potpis
Please do not feed the Trolls!

Blasphemy? How can I blaspheme? I'm a god!'
Re: Baza MariaDB REST servis u PHP 05.04.2018. u 14:37 · pre 104 meseci #4
Ocitavaju se podaci sa 10 masina i pakuju u tabelu tab_masine na REST servisu (insert) u tabeli ima polje br_masine (1 - 10 ) na prijemu ima 10 tabela M1,M2 ,M3 ..M10 koje odgovaraju broju masine .Bitno je u realnom vremenu puniti pojedinacne tabele kako podaci dolaze .Bilo koji nacin moze da bi se to uradilo bilo izmena servisa REST.php ili u samoj bazi MariaDB (trigeri ,stored procedure , SQL komande ) Ne mogu da promenim baza je MariaDB , treba posebne tabele M1,M2 ...

evo REST servis :


Code:

<?php
 
// get the HTTP method, path and body of the request
$method = $_SERVER['REQUEST_METHOD'];
$request = explode('/', trim($_SERVER['PATH_INFO'],'/'));
$input = json_decode(file_get_contents('php://input'),true);
 
// connect to the mysql database
$link = mysqli_connect('77.46.215.36', 'baza_masine', 'mas_132', 'tab_masine');
mysqli_set_charset($link,'utf8');
 
// retrieve the table and key from the path
$table = preg_replace('/[^a-z0-9_]+/i','',array_shift($request));
$key = array_shift($request)+0;


for ($j=0;$j<count($input['events']);$j++) {

    // escape the columns and values from the input object
    $columns = preg_replace('/[^a-z0-9_]+/i','',array_keys($input['events'][$j]));
    $values = array_map(function ($value) use ($link) {
      if ($value===null) return null;
      return mysqli_real_escape_string($link,(string)$value);
    },array_values($input['events'][$j]));
     
    // build the SET part of the SQL command
    $set = '';
    for ($i=0;$i<count($columns);$i++) {
      $set.=($i>0?',':'').'`'.$columns[$i].'`=';
      $set.=($values[$i]===null?'NULL':'"'.$values[$i].'"');
    }
     
    // create SQL based on HTTP method
    switch ($method) {
      case 'GET':
        $sql = "select * from `$table`".($key?" WHERE id=$key":''); break;
      case 'PUT':
        $sql = "update `$table` set $set where id=$key"; break;
      case 'POST':
       $sql = "insert into `$table` set $set "; break;
      .....................................






[Ovu poruku je menjao galenit dana 06.04.2018. u 16:09 GMT+1]
Re: Baza MariaDB REST servis u PHP 05.04.2018. u 18:09 · pre 104 meseci #6
Odgovorio sam da trebaju posebne tabele M01,M02 ... to ne zavisi od mene ,tagove za kod sam preskocio izvinjavam se (ima lep primer REST servisa koji radi) samo od konkretnog odgovora nema nista
Re: Baza MariaDB REST servis u PHP 05.04.2018. u 20:06 · pre 104 meseci #8
Hvala u svakom slucaju .Mozda nisam dobro objasnio ja imam PHP REST servis i trazio sam pomoc kako da podatke koji dolaze podelim u vise tabela sta je bolje resenje da se uradi bolje PHP REST servis ili da u toku punjenja tabele preko trigera formiram pomocne tabele M01,M02 ...

nkrgovic mi je odgovorio da pokusam sa partitioning, po primarnom kljucu ali nisam uspeo . Potrazicu bolje resenje preko PHP REST servisa hvala svima koji su pokusali da pomognu
Re: Baza MariaDB REST servis u PHP 05.04.2018. u 20:12 · pre 104 meseci #9
pa kakve to veze ima sa sql-om? dodju ti podaci "kako god" (kako ti
pricas sa svetom je abitno), ti onda te podatke spakujes, opet "kako
god" i onda te podatke insertujes de oces ... insert into kalakurcija
.... insert into kalakurcija1 ... etc ... zavisi kakva ti je data ...
pitanje ti je potpuno nejasno i ja bi reko na pogresnom mestu ... ne
kontam sta ti nije jasno kako da uradis?

- treba da uzmes datu od nekog klijenta (ti se kacis na njihov rest da
uzmes datu ili ti glumis rest server na koji oni salju datu)?

- treba tu datu da izparsiras

- treba tu datu da snimis i sql


koji od tri koraka ti nije jasan?
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: Baza MariaDB REST servis u PHP 05.04.2018. u 22:13 · pre 104 meseci #10
Cekaj, ja mislim da sam konacno shvatio:

Tebi stize data sa 10 masina. Hoces da svaka masina ima svoju tabelu? To je fora?

Ako je to, onda batali bazu, particije i sve ostalo : Parsiraj input u samom PHP-u i na osnovu toga odluci gde ce data da ide (u koju tabelu), ne resava se to na nivou baze...
Potpis
Please do not feed the Trolls!

Blasphemy? How can I blaspheme? I'm a god!'
Re: Baza MariaDB REST servis u PHP 06.04.2018. u 01:56 · pre 104 meseci #11
Ne vidim za sta ti ovde trebaju triggeri? Nisi objasnio konkretno sta je problem i kako bi da ga resis, ali apsolutno sam siguran da je SQL sintaksa najmanji problem ovde.

Trece, kako mislis da pravis M1... itd tabele pri novom upitu? Objasni malo sta predstavlja Mx i kada se kreira nova tabela. Ja sam ucen tako da je svako kreiranje nove tabele na nacin da ga upit preko servisa, a ne pri "instalaciji" aplikacije losa ideja. Nadam se da ne ide M1, M2... Mx.
Potpis
THE ONLY EASY DAY WAS YESTERDAY
Re: Baza MariaDB REST servis u PHP 06.04.2018. u 08:04 · pre 104 meseci #12
E sad je puno bolje napravio sam guzvu losim objasnjenjima i predstavljanjem problema pokusacu jos da objasnim a mogu dati parametre za direktan pristup na PI RASPBERRY

Evo deo PHP koda koji prihvata ove podatke o masinama

Code:


 $set = '';
    for ($i=0;$i<count($columns);$i++) {
      $set.=($i>0?',':'').'`'.$columns[$i].'`=';
      $set.=($values[$i]===null?'NULL':'"'.$values[$i].'"');
    }
     
    // create SQL based on HTTP method
    switch ($method) {
      case 'GET':
        $sql = "select * from `$table`".($key?" WHERE id=$key":''); break;
      case 'PUT':
        $sql = "update `$table` set $set where id=$key"; break;
      case 'POST':
       $sql = "insert into `$table` set $set "; break;
      
      case 'DELETE':
        $sql = "delete `$table` where id=$key"; break;
    }



Ovi podaci stizu sa udaljenog mesta preko REST servisa i pakuju se u tabelu danas
Code:

     xxxxxx  xxx    xxx    MachineNo   status        vreme   
========================================================================
    (126638, NULL, NULL,     '2',         '1',     '2018-04-06 03:25:05'),
    (126639, NULL, NULL,     '3',         '1',     '2018-04-06 03:25:05'),
    (126640, NULL, NULL,     '4',         '1',     '2018-04-06 03:25:05'),
    (126641, NULL, NULL,     '5',         '1',     '2018-04-06 03:25:05'),
    (126642, NULL, NULL,     '6',         '2',     '2018-04-06 03:25:05'),
    (126643, NULL, NULL,     '7',         '3',     '2018-04-06 03:25:05'),
    (126644, NULL, NULL,     '8',         '4',     '2018-04-06 03:25:05'),
    (126645, NULL, NULL,     '1',         '1',     '2018-04-06 03:25:44'),
    (126646, NULL, NULL,     '2',         '1',     '2018-04-06 03:25:44'),
    (126647, NULL, NULL,     '3',         '1',     '2018-04-06 03:25:44'),
    (126648, NULL, NULL,     '4',         '1',     '2018-04-06 03:25:44'),
    (126649, NULL, NULL,     '5',        '1',     '2018-04-06 03:25:44'),
    (126650, NULL, NULL,     '6',         '1',     '2018-04-06 03:25:44'),
    (126651, NULL, NULL,     '7',         '3',     '2018-04-06 03:25:44'),
    (126652, NULL, NULL,     '8',         '4',     '2018-04-06 03:25:44'),
    (126653, NULL, NULL,     '1',         '2',     '2018-04-06 03:26:01'),
    (126654, NULL, NULL,     '2',         '1',     '2018-04-06 03:26:01'),
    (126655, NULL, NULL,     '3',         '1',     '2018-04-06 03:26:01'),
    (126656, NULL, NULL,     '4',         '1',     '2018-04-06 03:26:01'),
    (126657, NULL, NULL,     '5',        '1',     '2018-04-06 03:26:01'),
    (126658, NULL, NULL,     '6',         '1',     '2018-04-06 03:26:01'),
    (126659, NULL, NULL,     '7',         '3',     '2018-04-06 03:26:01'),



hteo sam istovremeno kako dolaze podaci da ih u isto vreme razvrstam u tabele M01,M02,... zavisno od broja masine .Tabele su unapred pripremljene i ne kreiraju se u toku pristizanja podataka

M01,M02 ....... M10 i za to sam napravio triger koji to radi


Code:


CREATE DEFINER=`automatika`@`%` TRIGGER `M02_before_insert` AFTER INSERT ON `danas` FOR EACH ROW if (NEW.MachineNo='2' ) then
INSERT INTO M02    SET MachineNo = NEW.MachineNo,StatusNo = NEW.StatusNo,Mac_Stat =concat(NEW.MachineNo,NEW.StatusNo), EventDate=NEW.EventDate,stop_time =NEW.EventDate  ;
end if



Ovo je radilo dobro za masinu br 2 i tabelu M02 a za ostale masine nisam umeo da napravim .

Razlog sto sam hteo da mi to bude uradjeno sve u bazi je sto sam hteo jos da obradim podatke u svim tabelama i da to bude na nivou baze a kasnije PHP samo to ocita i prikaze u obliku tabela i dijagrama i povratne informacije upravljanja preko MODBUS protokola .

Zbog toga ovo pripada forumu na mestu MySQL baza

Prihvatam predlog da to se moze uraditi sve u PHP kodu koji sam prethodno dao (ali i to treba znati .... ) ja sam licno bio vise za varijantu da sva ta dogadjanja i preracunavanja budu u bazi .
Hvala svima koji su ispratili ovu pricu
Re: Baza MariaDB REST servis u PHP 06.04.2018. u 09:22 · pre 104 meseci #13
Ne znam tacno da napisem SQL kod ali mi se cini da ti u slucaju koji si opisao ne treba poseban trigger za svaku tabelu, vec je dovoljan samo jedan ako su tabele i njihova imena (brojevi) vec definisani. Nesto tipa:

Code:

for each row insert into concatenate('M0', NEW.MachineNo) set ...


Nevezano za problematiku vec za ciutljivost koda: malo je zbunjujuce da se trigger zove "before_insert" jedne tabele a da "okida" na "after insert" druge tabele.
Re: Baza MariaDB REST servis u PHP 07.04.2018. u 08:33 · pre 104 meseci #15
Ako podaci stižu RED po RED
Code:

(126638, NULL, NULL,     '2',         '1',     '2018-04-06 03:25:05'),


Ovdje skontaj koja kolona je BrojMasine
Code:

// build the SET part of the SQL command
    $BrojMasine="";
    $set = '';
    for ($i=0;$i<count($columns);$i++) {
      if($i == 3){
        $BrojMasine = $values[$i];
      }
      $set.=($i>0?',':'').'`'.$columns[$i].'`=';
      $set.=($values[$i]===null?'NULL':'"'.$values[$i].'"');
    }


Zatim SQL

Code:

// create SQL based on HTTP method
    switch ($method) {
      case 'GET':
        $sql = "select * from `M$BrojMasine`".($key?" WHERE id=$key":''); break;
      case 'PUT':
        $sql = "update `M$BrojMasine` set $set where id=$key"; break;
      case 'POST':
       $sql = "insert into `M$BrojMasine` set $set "; break;
      
      case 'DELETE':
        $sql = "delete `M$BrojMasine` where id=$key"; break;
    }


Ako baš hoćeš trigger imas IF ELSEIF

delimiter $$
CREATE DEFINER=`automatika`@`%` TRIGGER `M_before_insert` AFTER INSERT ON `danas` FOR EACH ROW

IF (NEW.MachineNo='1' ) then
INSERT INTO M01 SET MachineNo = NEW.MachineNo,StatusNo = NEW.StatusNo,Mac_Stat =concat(NEW.MachineNo,NEW.StatusNo), EventDate=NEW.EventDate,stop_time =NEW.EventDate ;
ELSEIF (NEW.MachineNo='2' ) then
INSERT INTO M02 SET MachineNo = NEW.MachineNo,StatusNo = NEW.StatusNo,Mac_Stat =concat(NEW.MachineNo,NEW.StatusNo), EventDate=NEW.EventDate,stop_time =NEW.EventDate ;
ELSEIF (NEW.MachineNo='3' ) then
INSERT INTO M03 SET MachineNo = NEW.MachineNo,StatusNo = NEW.StatusNo,Mac_Stat =concat(NEW.MachineNo,NEW.StatusNo), EventDate=NEW.EventDate,stop_time =NEW.EventDate ;

END IF;
END$$

Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme