Autor Zpráva
spaceradiocz
Profil
Dobrý den.

Mám problém s posíláním dat do databáze.

php vypadá takto
<body>
<h2>Zápis do databáze</h2>

<?php
include 'config.php'; //načteme soubor s údaji pro připojení k db
        mysql_connect($dbserver, $dblogin, $dbheslo); // připojíme se k db
        mysql_select_db($dbnazev) // vybereme db..
            or die("Chyba! Databáze nebo tabulka nebyla nalezena!");
        mysql_query("SET NAMES 'UTF-8'"); // nastavíme kódování
//když odešleme formulář následující script data uloží to tabulky v databázi
if(isset($_POST['send']))
{
        $day = htmlspecialchars($_POST['day']); //při odeslání příspěvku se nebezpečné znaky změní na entity
        $date = htmlspecialchars($_POST['date']); //při odeslání příspěvku se nebezpečné znaky změní na entity
        $name = htmlspecialchars($_POST['name']); //při odeslání příspěvku se nebezpečné znaky změní na entity
        $list = htmlspecialchars($_POST['list']); //při odeslání příspěvku se nebezpečné znaky změní na entity
        $images = htmlspecialchars($_POST['images']); //při odeslání příspěvku se nebezpečné znaky změní na entity
        $vloz ="insert into aktuality set day='".$day."', date='".$date."'; name='".$name."'; list='".$list."'; images='".$images."';";
        $result=mysql_query($vloz);
       //a přesměrujeme na zobrazení článků
        echo '<script type="text/javascript" for="window" event="onLoad()">
        <!--
            window.location.href="new.php?edit=ok"
        // --> </script>';    
}
$edit = htmlspecialchars($_GET['edit']);
if($edit == "ok")
    { echo '<b>Údaje byly vloženy</b>'; } // vypíšeme úspěšnost 
mysql_close(); //odpojíme se z db
?>
<!-- formulář pro zadávání ůdajů -->
    <form  method="post">
        Den: <input name="day"   type="text"><br>
        Datum: <input name="date" type="date"><br>
        Název: <input name="name" type="text"><br>
        Id události: <input name="list" type="text"><br>
        Odkaz timelinu: <input name="images" type="text"><br>

        <input type="submit" value="Vložit" name="send">
    </form>
</body>

databáze vypadá takto
-- phpMyAdmin SQL Dump
-- version 4.0.3
-- http://www.phpmyadmin.net
--
-- Počítač: localhost
-- Vygenerováno: Sob 22. čen 2013, 18:40
-- Verze serveru: 5.1.66-0+squeeze1
-- Verze PHP: 5.3.3-7+squeeze15

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Databáze: `bigbang`
--

-- --------------------------------------------------------

--
-- Struktura tabulky `aktuality`
--

CREATE TABLE IF NOT EXISTS `aktuality` (
  `date` date NOT NULL,
  `day` varchar(10) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL,
  `list` varchar(50) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL,
  `images` varchar(300) CHARACTER SET utf8 COLLATE utf8_czech_ci NOT NULL,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=3 ;

--
-- Vypisuji data pro tabulku `aktuality`
--

INSERT INTO `aktuality` (`date`, `day`, `list`, `name`, `images`, `id`) VALUES
('2013-06-02', 'Sobota', '159372260908979', 'TECHNO CITY Welcome Holiday | 29 / 06 / 13 | THE BIG BANG', 'https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-frc1/600990_162715290567325_1039451027_n.jpg', 2);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Napíše že data byla odeslána ale do databáze se to nezapíše.
Taps
Profil
spaceradiocz:

zkus si zobrazit chyby
$result=mysql_query($vloz) or die (mysql_error());
jenikkozak
Profil
Jednotlivé položky zapisované do databáze se v SQL dotazu neoddělují středníkem, ale čárkou.
Rfilip
Profil
Nijak nekontroluješ úspešnost vložení a tak nevidíš že máš SQL na 18 řádku špatně, syntaxe je:
INSERT INTO table_name (column1, column2, column3,...)  VALUES (value1, value2, value3,...)
jenikkozak
Profil
A nebo INSERT INTO table_name SET column1=value1, column2=value2, column3=value3
Taps
Profil
Rfilip:
je možný i jiný způsob zápisu
http://php.vrana.cz/psani-insert-into.php
spaceradiocz
Profil
Taps:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


Běží mi to na serveru. Pouze nainstalováno PHPmyadmin není nijak konfigurováno.


do databáze už to sice pošle nějaká data... tentokrát ale nejsou žádná data
Taps
Profil
spaceradiocz:
zkus
$vloz ="insert into aktuality set day='$day', date='$date', name='$name',list='$list',images='$images'";
spaceradiocz
Profil
Děkuji moc... funguje to.
Tori
Profil
spaceradiocz:
Na escapování dat vkládaných do DB se používá mysql_real_escape_string (anebo intval pro celá čísla). Jestli je chcete prohnat nejdřív přes htmlspecialchars tak klidně, ale poslední úprava před vložením musí být ta escapovací fce. Jinak vám jediný apostrof ve vkládaných datech rozbije SQL dotaz a data se nevloží.
spaceradiocz
Profil
Co se týče SQL jsem úplný začátečník a toto byl můj první projekt.
Taps
Profil
spaceradiocz:
jak píše Tori, základem je ošetřit hodnoty, které zapisuješ do DB, vyvaruješ se tak útoku - SQL injection
marcus33cz
Profil
Tori:
Přesně tak, k tomu ještě dodám, že je docela vhodné přidat si kus kódu, který to automaticky provede pro všechny zpracovávané proměnné - tedy i pole $_POST a $_GET obecně. Když už vkládáte config (ve kterém je dobré mít ty přihlašovací údaje), tak přidejte ještě jeden soubor, který ošetřuje ty vstupy.
Tori
Profil
marcus33cz:
je docela vhodné přidat si kus kódu, který to automaticky provede pro všechny zpracovávané proměnné - tedy i pole $_POST a $_GET obecně
No nevím, POST dejme tomu (za předpokladu, že všechna pole budou textová, žádná čísla) ... ale proč escapovat všechno z GET jako pro databázi? Stránkování? Nick uživatele, jehož profil chci vidět? Název controlleru, souboru k zobrazení/includování, ...?

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: