Autor | Zpráva | ||
---|---|---|---|
ludvalb Profil |
#1 · Zasláno: 8. 11. 2012, 15:17:13
Ahoj, potřeboval bych pomoci. Mám zápis
$sql2 = MySQL_Query("SELECT ks FROM vracene_zbozi WHERE autoID=".$produktID); if($sql2==true){$ks_vraceno = mysql_result($sql2,$i,'ks');}else{$ks_vraceno = 0;} ale $sql2==true zřejmě není syntakticky správně, noboť mi to stále vrací hodnotu z else. Jde mi o to, že když není nalezen žádný záznam, nesmí to zkončit chybou, ale vrátí mi to 0 a pokud je v databázi nalezen záznam, pak to vrátí jeho hodnotu. PS: je to součástí forcyklu, proto je z databáze vypisován řádek $i. Díky za pomoc. |
||
Tori Profil |
mysql_query vrací true jen v případě UPDATE/INSERT/DELETE dotazů. Na to co chcete by se dalo použít např.
if($sql2 !== false && mysql_num_rows($sql2)) (= dotaz byl syntakticky správně a vrátil nenulový počet řádků).
Volba n-tého řádku se dá jinak přesunout i do SQL (tak by se z databáze četl jen ten jeden požadovaný řádek dat). $sql2 = MySQL_Query("SELECT ks FROM vracene_zbozi WHERE autoID=".$produktID." LIMIT $i, 1"); $ks_vraceno = ($sql2 !== false && mysql_num_rows($sql2)) ? mysql_result($sql2, 0) : 0; Anebo možná aby se neprováděl xkrát stejný dotaz, bude lepší dát dotaz před cyklus a uvnitř cyklu jen číst výsledky, to by měl být znatelnější rozdíl, než s tím LIMITem: $sql2 = mysql_query("SELECT ks FROM vracene_zbozi WHERE autoID=".$produktID); $vracenoZaznamu = $sql2 ? mysql_num_rows($sql2)-1 : 0; for ($i = 0; $i < $neco; $i++) { $ks_vraceno = ($i <= $vracenoZaznamu) ? mysql_result($sql2, 0) : 0; } |
||
Joker Profil |
#3 · Zasláno: 8. 11. 2012, 16:13:05
ludvalb:
A neskončí třeba dotaz chybou? Jinak psát if (něco == true) je zbytečné, protože samotné to IF už testuje de facto to co je v podmínce == true, navíc v $sql2 v případě úspěchu nebude hodnota true, ale MySQL Result resource.
A ještě navíc proti tomu, že výsledek dotazu je prázdná množina, to neochrání, protože výsledek mysql_query je false jen v případě, že dotaz skončí chybou. K tomu slouží mysql_num_rows(); Dál mi přijde podezřelé nejdřív poslat dotaz do databáze a pak v cyklu hledat určitý řádek a extrahovat z něj hodnotu. Není to náhodou překomplikovaná varianta toho, co by se normálně udělalo jako cyklus while (mysql_fetch_row($sql2)) ?
|
||
mimochodec Profil |
#4 · Zasláno: 8. 11. 2012, 16:18:52
Joker:
„Jinak psát if (něco == true) je zbytečné, protože samotné to IF už testuje de facto to co je v podmínce == true“ Nic ve zlém, ale takhle napsané bych to chápal jen velmi těžko :-) Myslím že tím chceš říct, že místo if (něco == true) lze psát if (něco) .
|
||
ludvalb Profil |
Zkoušel jsem to poopravit, ale stále nejde.
Celý kod je takto. <?php if($find==""){$find = 1;}else{} $query = 'SELECT * FROM ((SELECT * FROM deni_prehled) UNION ALL (SELECT * FROM zaloha_deni_prehled)) deni_prehled_virtual WHERE deni_prehled_virtual.autoID LIKE "'.$find.'"'; $result = mysql_query($query, $connection) or die(mysql_error()); $dokladID = mysql_result($result, 0, "autoID"); $datum = mysql_result($result,0,'date'); ?> <fieldset> <legend><b>Vyhledání dokladu</b></legend> <form action="index.php?page=vracene-zbozi&find=<?php echo $find; ?>" method="post"> <input type="text" name="find" value="<?php echo $find ?>" size="60"> <input type="submit" value="Hledat doklad"> </form> </fieldset> <fieldset> <?php echo '<legend><b>Doklad cislo: '.$dokladID.', ze dne: '.$datum.'</b></legend> <table rules="cols" frame="above" align="center"> <tr><th>NAZEV</th><th>KS</th><th>KS PRODANO</th><th>KS VRACENO</th><th> </th></tr>'; for ($i = 0;$i< mysql_num_rows($result);$i++) { $datum_vraceni = Date("Y-m-d"); $produktID = mysql_result($result,$i,'produktID'); $prodano_ks = mysql_result($result,$i,'ks_prodej'); $sql = MySQL_Query("SELECT nazev FROM prodej WHERE autoID=".$produktID); $nazev = mysql_result($sql,0,'nazev'); $sql2 = MySQL_Query("SELECT ks FROM vracene_zbozi WHERE autoID=".$produktID); if($sql2==true){$ks_vraceno = mysql_result($sql2,$i,'ks');}else{$ks_vraceno = 0;} echo '<form action="insert-vracene-zbozi.php" method="post"> <input type="hidden" name="dokladID" value="'.$dokladID.'"> <input type="hidden" name="produktID" value="'.$produktID.'"> <input type="hidden" name="datum_vraceni" value="'.$datum_vraceni.'"> <tr class="radek'.($i%2).'"> <td>'.$nazev.'</td> <td><input type="text" name="ks" value="'.$ks.'" size="15"></td> <td>'.$prodano_ks.'</td> <td>'.$ks_vraceno.'</td> <td><input type="submit" value="Ulozit"></td> </tr> </form>'; } ?> </table> </fieldset> Jde o to, že v tabulce není nalezeno autoID=".$produktID, protože nemuselo být ještě vytvořeno. $sql2 = MySQL_Query("SELECT ks FROM vracene_zbozi WHERE autoID=".$produktID); Jde mi o to, aby když záznam neexistuje, tak aby to neskončilo chybou. |
||
Joker Profil |
#6 · Zasláno: 8. 11. 2012, 17:08:57
ludvalb:
Tak přesně jak jsem říkal. for ($i = 0;$i< mysql_num_rows($result);$i++) while ($zaznam = mysql_fetch_assoc($result)) mysql_result($result,$i,'produktID'); $zaznam["produktID"] Jinak mi připadá, že na řádku 29 je to $i špatně, protože to nemá být $i-tý řádek, ale první, stejně jako na řádku 27. Což bude asi příčina chyby, která je předmětem vlákna. |
||
ludvalb Profil |
#7 · Zasláno: 8. 11. 2012, 18:38:43
Tak jsem si ještě pročetl manuál a výsledek je správně takto (stačí přepsat řádek 29):
if(mysql_num_rows($sql2)==0){$ks_vraceno = 0;}else{$ks_vraceno = mysql_result($sql2,$i,'ks');} PS: mysql_result($sql2,$i,'ks') zde musí být $i, protože v tabulce může být více záznamů s hledaným id a je třeba vypsat postupně všechny. Všem děkuji za pomoc. |
||
Joker Profil |
#8 · Zasláno: 8. 11. 2012, 20:19:44
ludvalb:
„Tak jsem si ještě pročetl manuál a výsledek je správně takto“ To stačilo si přečíst [#2] a [#3], kde o tom mluvíme ;-) „PS: mysql_result($sql2,$i,'ks') zde musí být $i, protože v tabulce může být více záznamů s hledaným id a je třeba vypsat postupně všechny.“ Opravdu to tak je? Bude pořadí hledaného záznamu v tabulce vracene_zbozi vždy stejné, jako pořadí záznamu ve výsledku toho prvního dotazu? Zejména když ani jeden dotaz nepoužívá žádné řazení? Mezi těmi tabulkami by asi měla být nějaká jiná vazba, než stejné pořadí záznamu v tabulce. V každém případě je ale zbytečné v každém běhu cyklu vybírat všechny řádky a pak použít jeden. |
||
ludvalb Profil |
#9 · Zasláno: 8. 11. 2012, 20:26:04
Ještě jsem narazil na problém když jsem zadal do tabulky jen část ze všech vybraných produktů. Tak jsem to předělal na toto:
<?php if($find==""){$find = 1;}else{} $query = 'SELECT * FROM ((SELECT * FROM deni_prehled) UNION ALL (SELECT * FROM zaloha_deni_prehled)) deni_prehled_virtual LEFT JOIN vracene_zbozi on (deni_prehled_virtual.autoID = vracene_zbozi.dokladID AND deni_prehled_virtual.produktID = vracene_zbozi.produktID) WHERE deni_prehled_virtual.autoID LIKE "'.$find.'"'; $result = mysql_query($query, $connection) or die(mysql_error()); $dokladID = mysql_result($result, 0, "deni_prehled_virtual.autoID"); $datum = mysql_result($result,0,'deni_prehled_virtual.date'); ?> <fieldset> <legend><b>Vyhledání dokladu</b></legend> <form action="index.php?page=vracene-zbozi&find=<?php echo $find; ?>" method="post"> <input type="text" name="find" value="<?php echo $find ?>" size="60"> <input type="submit" value="Hledat doklad"> </form> </fieldset> <fieldset> <?php echo '<legend><b>Doklad cislo: '.$dokladID.', ze dne: '.$datum.'</b></legend> <table rules="cols" frame="above" align="center"> <tr><th>NAZEV</th><th>KS</th><th>KS PRODANO</th><th>KS VRACENO</th><th> </th></tr>'; for ($i = 0;$i< mysql_num_rows($result);$i++) { $datum_vraceni = Date("Y-m-d"); $produktID = mysql_result($result,$i,'deni_prehled_virtual.produktID'); $prodano_ks = mysql_result($result,$i,'deni_prehled_virtual.ks_prodej'); $ks_vraceno = mysql_result($result,$i,'vracene_zbozi.ks'); $sql = MySQL_Query("SELECT nazev FROM prodej WHERE autoID=".$produktID); $nazev = mysql_result($sql,0,'nazev'); echo '<form action="insert-vracene-zbozi.php" method="post"> <input type="hidden" name="dokladID" value="'.$dokladID.'"> <input type="hidden" name="produktID" value="'.$produktID.'"> <input type="hidden" name="datum_vraceni" value="'.$datum_vraceni.'"> <tr class="radek'.($i%2).'"> <td>'.$nazev.'</td> <td><input type="text" name="ks" value="'.$ks.'" size="15"></td> <td>'.$prodano_ks.'</td> <td>'.$ks_vraceno.'</td> <td><input type="submit" value="Ulozit"></td> </tr> </form>'; } ?> </table> </fieldset> Rozšířil jsem SELECT a podmínku jsem mohl zrušit. Nyní to funguje i když tabulka vracene_zbozi obsahuje jen některé položky. |
||
Tori Profil |
#10 · Zasláno: 8. 11. 2012, 21:43:23
ludvalb:
Tak i to dohledání názvu produktu jste mohl rovnou taky přidat do toho velkého SQL dotazu. |
||
Časová prodleva: 11 let
|
0