Autor Zpráva
Jcas
Profil
Pořád se v tom ztrácím. Může mi prosím někdo vysvětlit tu syntaxi?
Momentálně jsem si uvědomil, že to stále nechápu na následujícím příkladě.
$hodnota = $id_kat==$inzerat[$id_inz]['id_k'] ? '' : '`id_k` = '.$id_kat ;
Proměnou $hodnota chci použít na UPDATE
Fisir
Profil
Reaguji na Jcase:
Tento kousek kódu je ekvivalentní k tebou zmíněnému:
if($id_kat == $inzerat[$id_inz]['id_k']){
    $hodnota = '';
} else {
    $hodnota = '`id_k` = '.$id_kat;
}
Keeehi
Profil
Je to jen zkrácený způsob zapsání prostého ifu
if ($id_kat==$inzerat[$id_inz]['id_k']) {
    $hodnota ='';
} else {
    $hodnota = '`id_k` = '.$id_kat ;
}
Jcas
Profil
Sakra jsem to nechtěně odeslal. Takže do $hodnota chci nasázet 1-5 sloupců, kterým změním hodnoty v DB.
$sql = "UPDATE `inzerce` SET $hodnota
A nyní jde o to. $id_kat je int. Ale spojuji řetězec a `id_k` = je string.
Jak můžu spojit řetězec s int? A nakonec to celé chi vložit zase do řetězce kdy $sql = "UPDATE.........." DO $sql dávám řetězec definován uvozovkama.


Kdesi jsem obkoukal, že když pracuji se string, tak nic neřeším - příkl.
$sql = "SELECT......WHERE `sloupec` = $neco AND ....".
Tady má v $neco string
A když chcu int
$sql = "SELECT......WHERE `sloupec` = ".$neco." AND ...."

Ale když se na to teď dívám, tak také zřetězuji dohromady int a string.
Prostě to fakt doteď nechápu.
Keeehi
Profil
Já bych šel přes pole
$data = array(
    "sloupec_1" => "hodnota 1",
    "sloupec_2" => "hodnota 2"
);

array_walk($data, function(&$i,$k) {$i="`$k`=$i";});
$hodnota = implode($data, ', ');

Jcas:
Ale když se na to teď dívám, tak také zřetězuji dohromady int a string.
PHP si na rozdíl třeba od Cčka provede konverzi na string automaticky. Takže ano, můžeš bez problémů řetězit string a int.

Jinak
"Foo $bar"
je víceméně ekvivalentní zápisu
"Foo ".$bar
Jcas
Profil
Keeehi: Pěkné řešení, ale není to, to co mě trápí. A to je syntaxe stringů. Hodnota 1 je string a hodnota 2 je int.
Obojí zavřeš mezi "" a do sql dotazu vložíš string?


PHP si na rozdíl třeba od Cčka provede konverzi na string automaticky. Takže ano, můžeš bez problémů řetězit string a int.
No jo, ale DB očekává že budu vkládat int.
Keeehi
Profil
No to pole klidně může vypadat takto:
$data = array(
    "sloupec_1" => 1,
    "sloupec_2" => 2
);

Jcas:
No jo, ale DB očekává že budu vkládat int.
No to sice ano, ale PHP funkce které budeš předávat dotaz do databáze očekává string. Dotaz je vždy prostě string. A databáze očekává dotaz, kde na určitém místě bude řetězec, který z kterého umí vytvořit číslo.
Jcas
Profil
OK, děkuji.
juriad
Profil
Keeehi:
Já mám dojem, že různé sloupce mají různé datové typy, takže podle jejich datového typu je musíš správně zpracovat:

$data = array(
    "ciselny_sloupec" => 1,
    "retezcovy_sloupec" => 'baf'
);

$assignments = array();
foreach($data as $key => $value) {
  if (is_string($value)) {
    $assignments[] = "`$key` = '" . mysqli_real_escape_string($link, $value) . "'";
  } elseif (is_numeric($value)) {
    $assignments[] = "`$key` = " . ($value + 0);
  } else {
    die('Error; wrong data type');
  }
}

$clause = implode($assignments, ', ');
Doplněny []

Toto a mnohem víc řeší dibi. Viz dibiphp.com/cs/quick-start#toc-formatovani-poli
Keeehi
Profil
juriad:
takže podle jejich datového typu je musíš správně zpracovat
S tím souhlasím. Měl jsem pocit, že má jít vždy o čísla, tak v tom případě by to nebylo třeba řešit.

$assignments = "`$key` = " . ($value + 0);
1. $assignments[] (a to i u předchozího)
2. $value + 0 - pro přetypování mám raději (int)$value ale ani to tu není potřeba, když už jsi číslo ověřil funkcí is_numeric.
juriad
Profil
Keeehi:
1. díky, na to jsem zapomněl.
2. to je záměr; funguje to i pro float. Nejsem si jistý u NaN, gigantických čísel 1.2e100 atp.
Keeehi
Profil
juriad:
to je záměr; funguje to i pro float.
Moje myšlenka je, že přetypování není potřeba, protože proměnná $value musí být buď int nebo float. Nic jiného není možné. A pokud k intu přičtu nulu, bude to pořád int a pokud k floatu, bude to pořád float. tudíž je to naprosto zbytečné.
Samozřejmě můj způsob přetypování nezachová float a "zaokrouhlí" ho a převede na int.
Jcas
Profil
Takže mám tento výsledek. Syntaxi mám naprosto stejnou ať jde o číslo nebo o řetězec!!??
// vpředchozí části ošetřuji prom. než je pošlu do DB
//----PŘÍPRAVA DAT NA ULOŽENÍ-----
if(!isset($hlaska) && isset($_POST['enter'])) {
$stav = $mysqli->real_escape_string(trim($_POST['stav']));    
$nadpis = $mysqli->real_escape_string(trim($_POST['nadpis']));    
$inzerat = $mysqli->real_escape_string(trim($_POST['inzerat']));
$id_kat=intval($id_kat);
$id_chov=intval($id_chov);
$id_user=intval($id_user);
}    

if($id_kat!=$inzerat[$id_inz]['id_k']) {$hodnaota[] = '`id_k` = '.$id_kat ;}
if($_POST['nadpis']!=$inzerat[$id_inz]['nadpis']) {$hodnota[] = '`nadpis` = '.$nadpis ;}
if($_POST['inzerat']!=$inzerat[$id_inz]['inzerat']) {$hodnota[] = '`nadpis` = '.$inzerat ;}
if($_POST['stav']!=$inzerat[$id_inz]['stav']) {$hodnota[] = '`stav` = '.$stav ;}
if(!empty($hodnota)) {$hodnota[] = '`datum` = CURDATE()';
$clausule = implode(', ', $hodnota);}
        
$sql = "UPDATE `inzerce` SET $clausule WHERE `id_inz` = ". intval($_GET['id_inz']);
Keeehi
Profil
Skoro dobře. Jen u $stav,$ nadpis a $inzerát by přiřazení do $hodnota[] mělo vypadat takto:
$hodnota[] = '`nadpis` = \''.$nadpis.'\''
Jcas
Profil
Děkuji

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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