Jak dostat z db nejvyšší id?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
qteck
Člen | 164
+
0
-

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()
	{
        }

}
Tabetha
Člen | 140
+
-1
-

tak hodnotu autoincrement získaš napr. týmto dotazom :) k tej druhej časti ti neporadím, keďže transakcie nepoužívam :-)

SELECT AUTO_INCREMENT
FROM  INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'DatabaseName'
AND   TABLE_NAME   = 'TableName';
Myiyk
Člen | 321
+
0
-

@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.