Автор Тема: PHP+Sqlite3 проблеми с INSERT  (Прочетена 8504 пъти)

deant01

  • Напреднали
  • *****
  • Публикации: 221
  • Distribution: Debian/sid
  • Window Manager: Gnome 3
    • Профил
PHP+Sqlite3 проблеми с INSERT
« -: Jul 16, 2017, 23:20 »
Казус:
Имам определена Уеб форма, която събира някакви данни от потребителите. Данните се подават като променливи през PHP скрипт, който пък ги праща на Sqlite3. Понеже съм начинаеш съм ползва sqlite3 метода, но незнайно защо когато добави реда в таблицата, веднага добавя след него един допълнителен празен ред. Т.е. една операция добавя 2 реда, като единия е празен. Пускам кода, ако някой може да се сети защо е това.

<?php

$client_name=htmlspecialchars($_POST['client_name']);
$client_addr=htmlspecialchars($_POST['client_addr']);
$client_tel=htmlspecialchars($_POST['client_tel']);
$client_bulstat=htmlspecialchars($_POST['client_bulstat']);
$client_idnum=htmlspecialchars($_POST['client_idnum']);
$client_mol=htmlspecialchars($_POST['client_mol']);
$client_get=htmlspecialchars($_POST['client_get']);

$clientsdb = new SQLite3('clientsdb.db') or die('Unable to open database');

$clientsdb->exec("INSERT INTO clients (
                                client_name,
                                client_addr,
                                client_tel,
                                client_bulstat,
                                client_idnum,
                                client_mol,
                                client_get
                                )
                              VALUES (
                                '$client_name',
                                '$client_addr',
                                '$client_tel',
                                '$client_bulstat',
                                '$client_idnum',
                                '$client_mol',
                                '$client_get')"
                 ) or die('Create db failed');
?>
Активен

Ripples of paradox spread out across the sea of causality.

jet

  • Напреднали
  • *****
  • Публикации: 3473
  • Distribution: debian
  • Window Manager: kde
    • Профил
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #1 -: Jul 16, 2017, 23:46 »
А ако запиташ базата с един: SELECT * FROM clients
връша ли празен запис?
Активен

..⢀⣴⠾⠻⢶⣦⠀
  ⣾⠁⢠⠒⠀⣿⡁
  ⢿⡄⠘⠷⠚⠋
  ⠈⠳⣄⠀⠀⠀⠀  Debian, the universal operating system.

pennywise

  • Гост
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #2 -: Jul 16, 2017, 23:49 »
От хвърлянета на боб според мен най-вероятно част от кода ти се изплънява два пъти поради някаква причина - например веднъж на събмит и веднага след това в зависимост какво се случва след попълване на формата. Виж дали имаш грешки в sql от рода на "undefined".

Преди да записваш каквото и да е, е добра практика да провериш има ли какво до слагаш в базата.
Ако искаш сложи целия код, някой по-комптентен от мен ще ти обясни какво не е в ред.
Активен

deant01

  • Напреднали
  • *****
  • Публикации: 221
  • Distribution: Debian/sid
  • Window Manager: Gnome 3
    • Профил
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #3 -: Jul 17, 2017, 00:04 »
А ако запиташ базата с един: SELECT * FROM clients
връша ли празен запис?

да връща:(
----
sqlite> select * from clients;
1|фирма|адрес|телефон|булстат|ид номер|пешо|гошо
2|||||||
3|фирма2|адрес2|телефон2|булстат2|ид номер2|пешо2|гошо2
4|||||||
----
има и доста undefined грешки, които не мога да разбера от какво са:
–––
PHP message: PHP Notice:  Undefined index: client_idnum in /var/www/html/action.php on line 5
PHP message: PHP Notice:  Undefined index: client_mol in /var/www/html/action.php on line 6
PHP message: PHP Notice:  Undefined index: client_get in /var/www/html/action.php on line 7
PHP message: PHP Notice:  Undefined index: client_name in /var/www/html/action.php on line 12
PHP message: PHP Notice:  Undefined index: client_addr in /var/www/html/action.php on line 13
PHP message: PHP Notice:  Undefined index: client_tel in /var/www/html/action.php on line 14
PHP message: PHP Notice:  Undefined index: client_bulstat in /var/www/html/action.php on line 15
PHP message: PHP Notice:  Undefined index: client_idnum in /var/www/html/action.php on line 16
PHP message: PHP Notice:  Undefined index: client_mol in /var/www/html/action.php on line 17
–––
уж всичко от _POST се вижда. ако ги пусна с echo всички променливи излизат

то общо взето това ми е кода, има само още един фаил, който е самата форма
Активен

Ripples of paradox spread out across the sea of causality.

pennywise

  • Гост
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #4 -: Jul 17, 2017, 00:17 »
Изпращаш два пъти променливите за това има и такива грешки, нещо в логиката на кода не е както трябва, и ако само това ти е кода има още какво да се прави. Също доколкото си спомням от други SQL-и връзката е препоръчително да се затвори след като свършиш със записа, незнам как е с sqllite.
Активен

mystical

  • Напреднали
  • *****
  • Публикации: 326
  • Distribution: Debian, FreeBSD
  • Window Manager: XFCE
    • Профил
    • WWW
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #5 -: Jul 17, 2017, 01:09 »
Ако искаш да ти помогнат, дай пълния код от формуляра и на обработващата страница.
Добави защити и повече проверки. Примерно:

Код:
if (!empty($_POST['save'])) {
  $client_name = !empty($_POST['client_name']) ? htmlspecialchars($_POST['client_name']) : '';
}

Разгледай PHP Data Objects (PDO)

Виж работещ пример:
pdoinstance.php
database_config.php

Извиква се по следния начин:
Код:
<?php

$DATABASE_CONFIGURATION = 'database_config.php';
require_once dirname(__FILE__).'pdoinstance.php';
$db = new PDOinstance();

if (!empty($_POST['new'])) {
    $userid = $_POST['userid'];
    $operid = $_POST['operid'];
    $add = date('Y-m-d H:i:s');
    $created = date('Y-m-d H:i:s').' '.$_SESSION['data']['name'];
    $name = strip_tags($_POST['name']);
    $address = strip_tags($_POST['address']);
    $phone_number = strip_tags($_POST['phone_number']);
    $notes = $_POST['notes'];
    $sql = 'INSERT INTO `tickets` (`userid`, `operid`, `status`, `add`, `assign`, `end`, `created`, `notes`)
            VALUES (:userid, :operid, :status, :add, :assign, :end, :created, :notes)';
    $sth = $db->dbh->prepare($sql);
    $sth->bindValue(':userid', $userid, PDO::PARAM_INT);
    $sth->bindValue(':operid', $operid, PDO::PARAM_INT);
    $sth->bindValue(':status', '1', PDO::PARAM_INT);
    $sth->bindValue(':add', $add);
    $sth->bindValue(':assign', $_POST['assign']);
    $sth->bindValue(':end', $_POST['end']);
    $sth->bindValue(':created', $created);
    $sth->bindValue(':notes', $notes, PDO::PARAM_STR);
    $sth->execute();
   
    header("Location: user_tickets.php?userid={$userid}");
    exit;
}

?>

Хубавото на PDO е, че не си обвързан с определена БД. Поддържа различни видове БД и ако кода е читаво направен, променяш само променлива $dbtype='mysql';
Активен

Ако не можеш да градиш, поне не руши!

deant01

  • Напреднали
  • *****
  • Публикации: 221
  • Distribution: Debian/sid
  • Window Manager: Gnome 3
    • Профил
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #6 -: Jul 17, 2017, 06:08 »
Ето формата:
addclient.php:
---------------
<form action="action.php" method="post">
 <p>Име на клиент: <input type="text" name="client_name" /></p>
 <p>Адрес:<input type="text" name="client_addr" /></p>
 <p>Телефон:<input type="text" name="client_tel" /></p>
 <p>БУЛСТАТ:<input type="text" name="client_bulstat" /></p>
 <p>ИД. Номер<input type="text" name="client_idnum" /></p>
 <p>МОЛ:<input type="text" name="client_mol" /></p>
 <p>Получател:<input type="text" name="client_get" /></p>
 <p><input type="submit" /></p>
</form>
----------
sqlite3 вариант на action.php:
----------
<?php

$client_name=htmlspecialchars($_POST['client_name']);
$client_addr=htmlspecialchars($_POST['client_addr']);
$client_tel=htmlspecialchars($_POST['client_tel']);
$client_bulstat=htmlspecialchars($_POST['client_bulstat']);
$client_idnum=htmlspecialchars($_POST['client_idnum']);
$client_mol=htmlspecialchars($_POST['client_mol']);
$client_get=htmlspecialchars($_POST['client_get']);

$clientsdb = new SQLite3('clientsdb.db') or die('Unable to open database');

$clientsdb->exec("INSERT INTO clients (
                                client_name,
                                client_addr,
                                client_tel,
                                client_bulstat,
                                client_idnum,
                                client_mol,
                                client_get
                                )
                              VALUES (
                                '$client_name',
                                '$client_addr',
                                '$client_tel',
                                '$client_bulstat',
                                '$client_idnum',
                                '$client_mol',
                                '$client_get')"
                 ) or die('Create db failed');

$clientsdb->close();
?>
--------
PDO вариант на action.php (вчера един познат ми помага за него, преди да пиша във форума, той твърди, че при него прави само 1 ред, а при мен продължава да прави два. Почти съм сигурен, че той задава променливите статично, а не през _POST, когато тества, което ме кара да мисля, че проблема е при задаването на променливите..)
–––––
<?php

$client_name=htmlspecialchars($_POST['client_name']);
$client_addr=htmlspecialchars($_POST['client_addr']);
$client_tel=htmlspecialchars($_POST['client_tel']);
$client_bulstat=htmlspecialchars($_POST['client_bulstat']);
$client_idnum=htmlspecialchars($_POST['client_idnum']);
$client_mol=htmlspecialchars($_POST['client_mol']);
$client_get=htmlspecialchars($_POST['client_get']);

$clientsdb = new PDO('sqlite:clientsDB.db');

$clientsdb->exec("CREATE TABLE IF NOT EXISTS clients (
   client_id INTEGER PRIMARY KEY,
   client_name TEXT,
   client_addr TEXT,
   client_tel TEXT,
   client_bulstat TEXT,
   client_idnum TEXT,
   client_mol TEXT,
   client_get TEXT)");

$stmt = $clientsdb->query("SELECT name
            FROM sqlite_master
            WHERE type = 'table'
            ORDER BY name");

/* check if tables are created
$tables = [];
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
   $tables[] = $row['name'];
}

foreach($tables as $table)
{
   print_r($table);
}
*/

 
$insert = "INSERT INTO clients (client_name, client_addr, client_tel, client_bulstat, client_idnum, client_mol, client_get)
            VALUES (:client_name, :client_addr, :client_tel, :client_bulstat, :client_idnum, :client_mol, :client_get)";
$stmt = $clientsdb->prepare($insert);
 
 
$stmt->bindParam(':client_name', $client_name);
$stmt->bindParam(':client_addr', $client_addr);
$stmt->bindParam(':client_tel', $client_tel);
$stmt->bindParam(':client_bulstat', $client_bulstat);
$stmt->bindParam(':client_idnum', $client_idnum);
$stmt->bindParam(':client_mol', $client_mol);
$stmt->bindParam(':client_get', $client_get);

$stmt->execute();

echo $clientsdb->lastInsertId();
 
?>

П.П. - mystical мерси за отговорите, довечера продължавам да го мъча.
« Последна редакция: Jul 17, 2017, 06:09 от deant01 »
Активен

Ripples of paradox spread out across the sea of causality.

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8916
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #7 -: Jul 17, 2017, 09:02 »
Deante, не виждам (поне не си го сложил) най-простото от най-простото, което всеки начинаещ първо му е набито в чутората. И в моята също.

Веднага след изпращане да се пренасочва потребителя, а отсрещната страна да проверява за двойно изпращане. Защото иначе се случват точно такива  неща — празни редове, дублажи, чудесии.

п.п. Поне по времето, когато аз пишех php беше непрепоръчително да се правят и развалят връзки. Ползва се една единствена за целия ѝ живот. Пениуайз говори някакви модерни неща, но виждам, че ти ползваш процедурен код и чист SQL. При тях това определено не е така.
« Последна редакция: Jul 17, 2017, 09:08 от go_fire »
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

deant01

  • Напреднали
  • *****
  • Публикации: 221
  • Distribution: Debian/sid
  • Window Manager: Gnome 3
    • Профил
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #8 -: Jul 17, 2017, 09:27 »
Deante, не виждам (поне не си го сложил) най-простото от най-простото, което всеки начинаещ първо му е набито в чутората. И в моята също.

Веднага след изпращане да се пренасочва потребителя, а отсрещната страна да проверява за двойно изпращане. Защото иначе се случват точно такива  неща — празни редове, дублажи, чудесии.

п.п. Поне по времето, когато аз пишех php беше непрепоръчително да се правят и развалят връзки. Ползва се една единствена за целия ѝ живот. Пениуайз говори някакви модерни неща, но виждам, че ти ползваш процедурен код и чист SQL. При тях това определено не е така.

Само да повторя, че това е всъщност първия ми php код, който пиша. Сигурен съм, че има много сгрешено, но не мога да схвана къде е. Ясно е, че трябва да чета още :)
Активен

Ripples of paradox spread out across the sea of causality.

Naka

  • Напреднали
  • *****
  • Публикации: 3452
    • Профил
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #9 -: Jul 17, 2017, 10:53 »
сложи си приставката live HTTP headers за Firefox и гледай 'live' какво изпраща браузера като натиснеш събмит. Да не би да праща два пъти?

Да не би да натискаш Релоад на браузера. Тогава със сигурност ще я изпрати още един път.

Но независимо какъв е проблема със сигурност ще се сблъскаш с това: PRG (защо все му викам RPG :o )

https://en.wikipedia.org/wiki/Post/Redirect/Get
Иключително е досадно и няма оправия без този PRG патън.
« Последна редакция: Jul 17, 2017, 11:01 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

deant01

  • Напреднали
  • *****
  • Публикации: 221
  • Distribution: Debian/sid
  • Window Manager: Gnome 3
    • Профил
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #10 -: Jul 19, 2017, 22:09 »
След известно ръчкане по кода, тестове с други броузъри установих, че проблема се появавяа само при Iron Browser, който е дериват от Хромиум, което крайно ме учуди, защото на Хром няма такъв (де)ефект. Сега аз се чудя, този броузър във всички форми ли попълва по този начин данните или нещо в моя код го кара само той така да действа. Така де, искам да благодаря на всички участвали в дискусията, получих ценна информация, за която не се бях сетил дори да питам.
Активен

Ripples of paradox spread out across the sea of causality.

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8916
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: PHP+Sqlite3 проблеми с INSERT
« Отговор #11 -: Jul 19, 2017, 23:06 »
И аз харесвам Iron. Макар да се оказа, че и той е шпионски. Но, ако ще е нещо хромирано, най-добре немското.

Та на въпроса. Инспектора, какво казва?
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Please insert ...
Хумор
luda_glawa 9 4108 Последна публикация Dec 17, 2005, 02:02
от Xpucmo
php -> mysql : INSERT error
Web development
rip_darkman 2 3908 Последна публикация Jul 30, 2009, 17:35
от rip_darkman
SQLITE3 ":memory:"
Общ форум
sandman_7920 0 1431 Последна публикация Dec 07, 2009, 17:12
от sandman_7920
insert object в openoffice
Настройка на програми
nikolaj_i 4 3341 Последна публикация Jul 07, 2010, 20:44
от victim70
SQL. SQLite3. Сбор на стойности, някои от които са NULL
Общ форум
laskov 7 6396 Последна публикация Feb 25, 2017, 20:24
от growchie