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

1CREATE TABLE `papi` (
2  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
3  `rodic` mediumint(8) unsigned NOT NULL DEFAULT 0,
4  `ident` varchar(128) COLLATE utf8_czech_ci NOT NULL,
5  `nazev` varchar(64) COLLATE utf8_czech_ci NOT NULL,
6  `obsah` longtext COLLATE utf8_czech_ci NOT NULL,
7  `title` varchar(128) COLLATE utf8_czech_ci NOT NULL,
8  `keyw` varchar(200) COLLATE utf8_czech_ci NOT NULL,
9  `descr` varchar(200) COLLATE utf8_czech_ci NOT NULL,
10  `prio` int(7) NOT NULL,
11  `typ_galerie` tinyint(3) unsigned NOT NULL DEFAULT 1,
12  `url` varchar(128) COLLATE utf8_czech_ci DEFAULT NULL,
13  `url_nove_okno` tinyint(1) DEFAULT NULL,
14  `nofollow` tinyint(1) NOT NULL,
15  `menu` tinyint(1) NOT NULL COMMENT '1=horní menu; 2=levé menu',
16  `nezobrazovat` tinyint(1) NOT NULL DEFAULT 0,
17  `aktualizace` date NOT NULL,
18  PRIMARY KEY (`id`),
19  FULLTEXT KEY `vyhledavani` (`nazev`,`obsah`,`title`,`keyw`)
20) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci
CREATE TABLE `papi` (
  `id` mediumint(8unsigned NOT NULL AUTO_INCREMENT,
  `rodic` mediumint(8unsigned NOT NULL DEFAULT 0,
  `ident` varchar(128COLLATE utf8_czech_ci NOT NULL,
  `nazev` varchar(64COLLATE utf8_czech_ci NOT NULL,
  `obsah` longtext COLLATE utf8_czech_ci NOT NULL,
  `title` varchar(128COLLATE utf8_czech_ci NOT NULL,
  `keyw` varchar(200COLLATE utf8_czech_ci NOT NULL,
  `descr` varchar(200COLLATE utf8_czech_ci NOT NULL,
  `prio` int(7NOT NULL,
  `typ_galerie` tinyint(3unsigned NOT NULL DEFAULT 1,
  `url` varchar(128COLLATE utf8_czech_ci DEFAULT NULL,
  `url_nove_okno` tinyint(1DEFAULT NULL,
  `nofollow` tinyint(1NOT NULL,
  `menu` tinyint(1NOT NULL COMMENT '1=horní menu; 2=levé menu',
  `nezobrazovat` tinyint(1NOT 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:

1$prIns=mysqli_query($spojeni_db, "insert into ".$dbnazev."_obsah values('', 
2'".sqlInj($spojeni_db, $_POST[rodic])."', 
3'$ident',
4'$nazev', 
5'".addslashes($_POST[obsah])."', 
6'$title', 
7'$keyw', 
8'$desc', 
9'".sqlInj($spojeni_db, $_POST[prio])."', 
10'".sqlInj($spojeni_db, $_POST[typ_galerie])."', 
11'".sqlInj($spojeni_db, $_POST[url])."', 
12'".sqlInj($spojeni_db, $_POST[url_nove_okno])."', 
13'".sqlInj($spojeni_db, $_POST[nofollow])."', 
14'".sqlInj($spojeni_db, $_POST[menu])."', 
15'".sqlInj($spojeni_db, $_POST[nezobrazovat])."',
16 now())");
17 $newidObsah=mysqli_insert_id();
$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
1$stmt = $spojeni_db->prepare("insert into `".$dbnazev."_obsah` (
2    `rodic`,
3    `ident`,
4    `nazev`,
5    `obsah`,
6    `title`,
7    `keyw`,
8    `descr`,
9    `prio`,
10    `typ_galerie`,
11    `url`,
12    `url_nove_okno`,
13    `nofollow`,
14    `menu`,
15    `nezobrazovat`,
16    `aktualizace`)
17    values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,now())");
18$stmt->bind_param('issssssiisiiii',
19    $_POST['rodic'],
20    $ident,
21    $nazev,
22    $_POST['obsah'],
23    $title,
24    $keyw,
25    $desc,
26    $_POST['prio'],
27    $_POST['typ_galerie'],
28    $_POST['url'], 
29    $_POST['url_nove_okno'], 
30    $_POST['nofollow'], 
31    $_POST['menu'], 
32    $_POST['nezobrazovat']
33    );
34$stmt->execute();
35if($stmt->error)
36{
37    printf("Error: %s.\n", $stmt->error);
38}
39$newidObsah=$stmt->insert_id;
$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.
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.

Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:


Běda vám, jestli to bude blábol.

0