Autor Zpráva
Verona
Profil *
Ahoj mám takovou to tabulku:

CREATE TABLE `papi` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `rodic` mediumint(8) unsigned NOT NULL DEFAULT 0,
  `ident` varchar(128) COLLATE utf8_czech_ci NOT NULL,
  `nazev` varchar(64) COLLATE utf8_czech_ci NOT NULL,
  `obsah` longtext COLLATE utf8_czech_ci NOT NULL,
  `title` varchar(128) COLLATE utf8_czech_ci NOT NULL,
  `keyw` varchar(200) COLLATE utf8_czech_ci NOT NULL,
  `descr` varchar(200) COLLATE utf8_czech_ci NOT NULL,
  `prio` int(7) NOT NULL,
  `typ_galerie` tinyint(3) unsigned NOT NULL DEFAULT 1,
  `url` varchar(128) COLLATE utf8_czech_ci DEFAULT NULL,
  `url_nove_okno` tinyint(1) DEFAULT NULL,
  `nofollow` tinyint(1) NOT NULL,
  `menu` tinyint(1) NOT NULL COMMENT '1=horní menu; 2=levé menu',
  `nezobrazovat` tinyint(1) NOT NULL DEFAULT 0,
  `aktualizace` date NOT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `vyhledavani` (`nazev`,`obsah`,`title`,`keyw`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci

A takto do ní vkládám:

$prIns=mysqli_query($spojeni_db, "insert into ".$dbnazev."_obsah values('', 
'".sqlInj($spojeni_db, $_POST[rodic])."', 
'$ident',
'$nazev', 
'".addslashes($_POST[obsah])."', 
'$title', 
'$keyw', 
'$desc', 
'".sqlInj($spojeni_db, $_POST[prio])."', 
'".sqlInj($spojeni_db, $_POST[typ_galerie])."', 
'".sqlInj($spojeni_db, $_POST[url])."', 
'".sqlInj($spojeni_db, $_POST[url_nove_okno])."', 
'".sqlInj($spojeni_db, $_POST[nofollow])."', 
'".sqlInj($spojeni_db, $_POST[menu])."', 
'".sqlInj($spojeni_db, $_POST[nezobrazovat])."',
 now())");
 $newidObsah=mysqli_insert_id();

1. Problém je že se mi nevloží primární ID a tudíž se nic nezapíše. Jak by měl zápis vypadat? ID je AUTO_INCREMENT, tak proč se nevloží?
2. Když uživatel ve formuláři nezadá například prio, která je int(7), tak opět se to nevloží, to je asi tím že mu v tu chvíli posílám do DB textový řetězec, lze toto ošetřit zápisem při vkládání a nebo to mám řešit podmínkou IF je řetězec prázdný přiřaď 0, ale já bych tam chtěla mít prázdnou a né tu 0.

Děkuji za radu
Kajman
Profil
Zkuste spíše něco takového
$stmt = $spojeni_db->prepare("insert into `".$dbnazev."_obsah` (
    `rodic`,
    `ident`,
    `nazev`,
    `obsah`,
    `title`,
    `keyw`,
    `descr`,
    `prio`,
    `typ_galerie`,
    `url`,
    `url_nove_okno`,
    `nofollow`,
    `menu`,
    `nezobrazovat`,
    `aktualizace`)
    values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,now())");
$stmt->bind_param('issssssiisiiii',
    $_POST['rodic'],
    $ident,
    $nazev,
    $_POST['obsah'],
    $title,
    $keyw,
    $desc,
    $_POST['prio'],
    $_POST['typ_galerie'],
    $_POST['url'], 
    $_POST['url_nove_okno'], 
    $_POST['nofollow'], 
    $_POST['menu'], 
    $_POST['nezobrazovat']
    );
$stmt->execute();
if($stmt->error)
{
    printf("Error: %s.\n", $stmt->error);
}
$newidObsah=$stmt->insert_id;
Verona
Profil *
Prososím o vysvětlení co znamená hodnota 'issssssiisiiii' do pole ID?
A jaký je rozdíl mezi mysqli_query a $stmt = $spojeni_db->prepare proč ten můj kód nelze použít?

Děkuji za objasnění
tttt
Profil *
Viz php.net/manual/en/mysqli-stmt.bind-param.php, parametr $types. S ID to nemá nic společného, říká jaký datový typ mají další parametry. ID není uvedené, tedy ho doplní databáze.

Tvůj kód není špatně, dalo by se to tak udělat taky. Nicméně to, co poslal Kajman má hned několik výhod – je to přehlednější (parametry se předávají jako pole, není potřeba sestavovat řetězec s dotazem), implicitně to ošetřuje SQL injection.

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:

0