Přihlásit se

předání dat z javascript do PHP

23. zář 2015 12:59 - 23. zář 2015 13:02 #123547
Odpověď od karel
Zkušený uživatel
vyzkoušejte, [strike]ale (imho) nebude fungovat, protože JS "nedrží" přihlášeného uživatele (v session/cookies) - jako když budete volat stejnou URL z jiného prohlížeče.[/strike]

Znáte-li řešení, sdělte ho - pomůžete ostatním při řešení stejného problému, i případný "rádce" bude vědět, poradil-li správně nebo špatně.

23. zář 2015 15:17 #123548
Odpověď od Cony
Moderátor
Ano to by fungovat mělo, popř. JFactory::getUser()->id nebo můžete také testovat zda je uživatel přihlášen pomocí JFactory::getUser()->guest

23. zář 2015 15:18 #123549
Odpověď od Cony
Moderátor
Jinak do toho volání AJAX si můžete přidat proměných dle libosti, stačí rozšířit pole data: {} o dal39 prvky.

23. zář 2015 19:38 #123554
Odpověď od Ernst
Joomla Expert
Ano funguje, jak jsem si myslel.
Pokud někdo tuhle diskuzi sleduje, tak pak lokace.php vypadá následovně:
<?php
define( '_JEXEC', 1 );
if (stristr( $_SERVER, 'win32' )) {
define( 'JPATH_BASE', realpath(dirname(__FILE__).'\..\..\..' ));
} else define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../../..' ));
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE.DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE.DS.'includes'.DS.'framework.php' );
$app =& JFactory::getApplication('site');
$app->initialise();
jimport( 'joomla.user.user' );
jimport( 'joomla.user.helper' );
$real_lat = floatval($_REQUEST);
$real_lgt = floatval($_REQUEST);
$user = JFactory::getUser()->username;
$db =& JFactory::getDBO();
$query = $db->getQuery(true);
$fields = array($db->quoteName('reallat') . ' = ' . $db->quote($real_lat), $db->quoteName('reallgt') . ' = ' . $db->quote($real_lgt));
$conditions = array($db->quoteName('display_name') . ' = "$user"');
$query->update($db->quoteName('#__lovefactory_profiles'))->set($fields)->where($conditions);
$db->setQuery($query);
$db->query();
?>

Možná se tam tahá něco i zbytečně, to ještě otestuji

23. zář 2015 19:49 #123555
Odpověď od Ernst
Joomla Expert
a máte Cony pravdu, použil jsem tam raději to JFactory::getUser()->id, tam mám opravdu jistotu, že nenastane duplicita.

PS jak zde vkládáte ukázky kódu do toho rámečku? To neumím a vypsání do textu je trochu nepřehledné.

24. zář 2015 09:26 #123561
Odpověď od Cony
Moderátor

ernst napsal: PS jak zde vkládáte ukázky kódu do toho rámečku? To neumím a vypsání do textu je trochu nepřehledné.


V horní řadě ikon nad smajlíkama, cca uprostřed ikona "kód", nebo ručně

[code]
Tady bude kód
[/code]

24. zář 2015 10:44 #123562
Odpověď od Ernst
Joomla Expert
Tak to zkusím stejně jsem měl chybu v tom zápisu do databáze. Správně má být to lokace.php
Code:
<?php define( '_JEXEC', 1 ); if (stristr( $_SERVER['SERVER_SOFTWARE'], 'win32' )) { define( 'JPATH_BASE', realpath(dirname(__FILE__).'\..\..\..' )); } else define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../../..' )); define( 'DS', DIRECTORY_SEPARATOR ); require_once ( JPATH_BASE.DS.'includes'.DS.'defines.php' ); require_once ( JPATH_BASE.DS.'includes'.DS.'framework.php' ); $app =& JFactory::getApplication('site'); $app->initialise(); jimport( 'joomla.user.user' ); jimport( 'joomla.user.helper' ); $real_lat = floatval($_REQUEST['lat']); $real_lgt = floatval($_REQUEST['lgt']); $user = intval(JFactory::getUser()->id); $db =& JFactory::getDBO(); $query = $db->getQuery(true); $fields = array($db->quoteName('reallat') . ' = ' . $db->quote($real_lat), $db->quoteName('reallgt') . ' = ' . $db->quote($real_lgt)); $conditions = array($db->quoteName('user_id') . ' = '.$user); $query->update($db->quoteName('#__lovefactory_profiles'))->set($fields)->where($conditions); $db->setQuery($query); $db->query(); ?>

24. zář 2015 16:52 #123570
Odpověď od Cony
Moderátor
Používáte Joomlu (i když tady poměrně nešikovně nepřímo), používejte tedy její "vychytávky".
Místo šahání přímo na $_REQUEST zkuste
Code:
$real_lat = $app->input->getInt('lat',0); $real_lgt = $app->input->getInt('lgt',0);
Odstraňte & u těcto řádků - emitovalo by to deprecated hlášení
Code:
$app =& JFactory::getApplication('site'); $db =& JFactory::getDBO();
Měl by jste si asi také přidat kontrolu na to, že uživatel je přihlášen, něco jako
Code:
if ($user) { ... }

25. zář 2015 11:56 - 25. zář 2015 12:00 #123586
Odpověď od Ernst
Joomla Expert
děkuji za rady, zkusím to.
Teď jsem aplikoval tyto informace v php, tam moc rad nepotřebuji.
To první funguje, jen místo getint( musím dát get( , potřebuji to na desetinná místa.
To druhé nefunguje, naopak to vypíše parse error. Musím tam to $ nechat.
Test na přihlášení nepotřebuji, všichni uživatelé webu musí být přihlášeni, ale dát ho tam mohu.
Kvůli podmínkám jsem tam musel přidat čtení z databáze, tak to teď vypadá takto:
Code:
<?php define( '_JEXEC', 1 ); if (stristr( $_SERVER['SERVER_SOFTWARE'], 'win32' )) { define( 'JPATH_BASE', realpath(dirname(__FILE__).'\..\..\..' )); } else define( 'JPATH_BASE', realpath(dirname(__FILE__).'/../../..' )); define( 'DS', DIRECTORY_SEPARATOR ); require_once ( JPATH_BASE.DS.'includes'.DS.'defines.php' ); require_once ( JPATH_BASE.DS.'includes'.DS.'framework.php' ); $app =& JFactory::getApplication('site'); $app->initialise(); jimport( 'joomla.user.user' ); jimport( 'joomla.user.helper' ); $real_lat = $app->input->get('lat',0); $real_lgt = $app->input->get('lgt',0); $user = intval(JFactory::getUser()->id); $db = JFactory::getDbo(); $query = $db->getQuery(true); $conditions = array($db->quoteName('user_id') . ' = '.$user); $query->select(array('field_50','membership_sold_id')) ->from($db->quoteName('#__lovefactory_profiles')) ->where($conditions); $db->setQuery($query); $row = $db->loadRow(); $db = JFactory::getDbo(); $query = $db->getQuery(true); $conditions = array($db->quoteName('user_id') . ' = '.$user); $query->select(array('membership_id')) ->from($db->quoteName('#__lovefactory_memberships_sold')) ->where($conditions); $db->setQuery($query); $row1 = $db->loadRow(); $db =& JFactory::getDBO(); $query = $db->getQuery(true); if (!($row[0]==0 and $row1[0]==2)){ $fields = array($db->quoteName('reallat') . ' = ' . $db->quote($real_lat), $db->quoteName('reallgt') . ' = ' . $db->quote($real_lgt));} else { $fields = array($db->quoteName('reallat') . ' = ' . $db->quote($real_lat), $db->quoteName('reallgt') . ' = ' . $db->quote($real_lgt),$db->quoteName('field_43_lat') . ' = ' . $db->quote($real_lat), $db->quoteName('field_43_lng') . ' = ' . $db->quote($real_lgt)); } $conditions = array($db->quoteName('user_id') . ' = '.$user); $conditions = array($db->quoteName('user_id') . ' = '.$user); $query->update($db->quoteName('#__lovefactory_profiles'))->set($fields)->where($conditions); $db->setQuery($query); $db->query(); ?>

Jak moc zatěžují ty dotazy na databázi server? Musel jsem je i jinde párkrát přidat.

25. zář 2015 17:37 #123592
Odpověď od Cony
Moderátor
ad 1/ Pravda getInt ne, ale můžete použít getFloat - oproti get si zajistíte, že vrácená hodnota bude opravdu float
ad 2/ Já ale nepsal odstranit $, ale & :)

ernst napsal: Jak moc zatěžují ty dotazy na databázi server? Musel jsem je i jinde párkrát přidat.


Podle toho jak jsou napsané, jak je udělaná databáze, jestli používají indexy apod. Pokud by se měli dotazy opakovat, můžete si dotaz zavolat jen jednou a pak si výsledek někde pamatovat...

25. zář 2015 22:47 #123605
Odpověď od Ernst
Joomla Expert
ad 2 přehlédl jsem se , omlouvám se.
dotazy jsou všechny psané jako ty dva v lokace.php

a teď můj oblíbený dotaz, jak pamatovat? volám je v různých php a různých třídách. Tak asi objekty použít nemůžu, snad nějaké parent, ale ty ještě neumím.

Jak je udělána databáze na hostingu netuším. je to mysqli

26. zář 2015 00:00 #123607
Odpověď od Cony
Moderátor
mysqli neni databáze ale způsob připojení k databázi MySQL.

Jak je udělaná - tím nemyslím jak funguje MySQL, ale jak si to rozšíření (popř. Vy) vytváří tabulky, jaké mají indexy, jaká data apod.

A kde data ukládat? Nevím tedy přesně co ta pole mají za význam, ae nestačilo by Vám je přečíst jen jednou v rámci Session? a pak si je udržovat v session proměnné?

26. zář 2015 12:32 #123609
Odpověď od Ernst
Joomla Expert
Děkuji, zamyslím se nad tím . Session je vlastně platná po celou relaci?

Ale mám jeden problém, na který nemohu přijít.
Potřebuji do numerického políčka v databázi nastavit NULL
Když to udělám takhle:
Code:
If($row[4]==1) { $db = JFactory::getDBO(); $query = $db->getQuery(true); $fields = array($db->quoteName('field_43_lat') . ' = ' . $db->quote(""), $db->quoteName('field_43_lng') . ' = ' . $db->quote(""),); $conditions = array($db->quoteName('user_id') . ' = '.$user); $query->update($db->quoteName('#__lovefactory_profiles'))->set($fields)->where($conditions); $db->setQuery($query); $db->query(); }

Nastaví se mi tam nula

26. zář 2015 14:24 #123611
Odpověď od Cony
Moderátor
Session = Relace

$db->quote("") - posíláte prázdný řetězec, to není null, pošlete opravdu null.

26. zář 2015 17:04 #123613
Odpověď od Ernst
Joomla Expert
to jsem všechno zkoušel, dokonce jsem tam poslal proměnnou s hodnotou NULL, ale v databázi je 0
Ta pole jsou decimal(15,12)

Powered by Fórum