předání dat z javascript do PHP

Odpověď od karel
23. zář 2015 12:59 - 23. zář 2015 13:02 #123547
vyzkoušejte, 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.

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ě.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
23. zář 2015 15:17 #123548
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

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

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

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
23. zář 2015 19:38 #123554
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

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
23. zář 2015 19:49 #123555
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é.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

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

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]

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
24. zář 2015 10:44 #123562
Tak to zkusím stejně jsem měl chybu v tom zápisu do databáze. Správně má být to lokace.php
<?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();
  ?>

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
24. zář 2015 16:52 #123570
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
$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í
$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
if ($user) {
...
}

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
25. zář 2015 11:56 - 25. zář 2015 12:00 #123586
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:
<?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.

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
25. zář 2015 17:37 #123592
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...

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
25. zář 2015 22:47 #123605
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

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Cony
26. zář 2015 00:00 #123607
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é?

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
26. zář 2015 12:32 #123609
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:
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

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

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

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

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.

Odpověď od Ernst
26. zář 2015 17:04 #123613
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)

Pro možnost přispívání do fóra je nutné: Přihlásit se nebo Vytvořit účet.