Jak dostat z db nejvyšší id?
- qteck
- Člen | 164
Ahoj,
mám dvě otázky, první je: Jak dostat z db nejvyšší id? Udělal jsem si takovouto metodu:
<?php
function getIdOfLastPic()
{
$lastId = $this->conn->table('gallery_pictures')->select('id')->order('id DESC')->limit(1)->fetch();
return $lastId ? $lastId->id : 0;
}
---
$newNameId = ($this->upload->getIdOfLastPic());
Funguje to správně, ale neuvědomil jsem si, co se stane, když tabulka bude prázdná. Nejvyšší následující id je třeba 46, ale protože v db nejsu žádné záznamy tak mi ta funkce hodí 0. a tak potom mám v DB názvy obrázku 1,2,3,4,5,6 a id je 41.42.46.47… druhá várka už funguje normálně.
Vzpomínám si že e to dalo něják jednoduše přes mysql dotaz. Nemá na to nette nějákou specialitku?
Druhá otázka je jak zaimplemantovat transakci do toho kódu kde načítám id, neboť načítám před foreachem a jesliže někdo přidává obrázky, třeba deset, bude tam nějáká prodleva, jestliže někdo přidá v průběhu toho prvního přidávání, může vzniknout kolize.
Kdybych to psal klasicky, tak to prostě napíšu v presenteru, ale mám metodu v modelu, volám z ní id a pod jejím volání v presenteru dopočítám id podle počtu uploadovaných záznamů. Chtěl bych tu transakci sokončit potom co se to všechno nahází do db.
Kód vypadá takto:
<?php
namespace App\Presenters;
use Nette,
App\Model,
Nette\Application\UI\Form;
use Nette\Image,
Nette\Diagnostics\Debugger;
class UploadPresenter extends BasePresenter
{
/**
*
* @var Repository\Upload @inject
*/
public $upload;
function createComponentUploadForm()
{
$form = new Form;
$form->addSelect('gallery', 'Přiřadit galerii: ', $this->upload->getGalleries());
$form->addText('id_author','Tvoje ID')
->addRule($form::FILLED);
$form->addUpload('img','Snímky: ', true)
->addRule($form::FILLED, 'Je potřeba vybrat nějaké snímky.')
->addRule(Form::IMAGE, 'Obrázek může být pouze ve formátu jpg, png nebo gif.')
->addRule(Form::MAX_FILE_SIZE,'Velikost snímku nesmí překročit 2 mb.', 2*1048576);
$form->addSubmit('upload', 'Nahrát');
$form->onSuccess[] = array($this, 'UploadFormSubmitted');
return $form;
}
function UploadFormSubmitted(Form $form)
{
$valuesOfForm = $form->getValues();
Debugger::dump($valuesOfForm);
$path_original = 'images/galleries/'.$valuesOfForm->gallery.'/original/';
$path_resized = 'images/galleries/'.$valuesOfForm->gallery.'/resized/';
$newNameId = ($this->upload->getIdOfLastPic());
foreach($valuesOfForm->img as $img)
{
$newNameId++;
var_dump($newNameId);
if(!is_dir($path_original) or !is_dir($path_resized))
{
$handle_dir = mkdir($path_original, 0755, true);
$handle_dir2 = mkdir($path_resized, 0755, true);
}
else
{
$handle_dir = $handle_dir2 = true;
}
if($handle_dir && $handle_dir2)
{
$movedSuccessfully = move_uploaded_file($img->temporaryFile, $path_original.$img->name);
}
if($movedSuccessfully)
{
$type = explode('.', $img->name);
$newName = $newNameId . '.' . \Nette\Utils\Strings::lower(end($type));
rename($path_original . $img->name , $path_original . $newName);
$this->upload->insertPic($newName, $valuesOfForm->id_author, $valuesOfForm->gallery);
$imgResize = \Nette\Image::fromFile($path_original . $newName);
$imgResize->resize(197, NULL);
$imgResize->sharpen();
$imgResize->save($path_resized. $newName,80);
}
}
$this->flashMessage('Upload proběhl úspěšně!', 'info');
}
public function renderDefault()
{
}
}
- Myiyk
- Člen | 321
@qteck:
Na transakce v databáti jsou tři příkazy.
$this->conn->beginTransaction(); // zahájí transakci
$this->conn->commit(); // potvrdí data
$this->conn->rollBack(); // stornuje změny
Prvně transakci zahájíš, provedeš změny v databázi a podle potřeby je buď potvrdíš, nebo stornuješ. Skončí-li nějaký příkaz chybou, transakce se stornuje automaticky.
Storno zruší změny, které se provedly od začátku transakce.