Autor Zpráva
ludvalb
Profil
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;
}
Btw odkud se bere to $produktID a $i, nešlo by to řešit joinem v nějakém nadřazeném SQL dotazu?
Joker
Profil
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
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
ludvalb:
Tak přesně jak jsem říkal.
for ($i = 0;$i<  mysql_num_rows($result);$i++)
Proč místo tohohle neuděláte:
while ($zaznam = mysql_fetch_assoc($result))
A místo:
mysql_result($result,$i,'produktID');
(o kterém manuál říká, že je to pomalé) pak můžete použít:
$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
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
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
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
ludvalb:
Tak i to dohledání názvu produktu jste mohl rovnou taky přidat do toho velkého SQL dotazu.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: