Перейти к содержанию

SQL запрос к базе php


Рекомендуемые сообщения

Добрый день. Подскажите, как можно сформировать запрос строк (цикличный) из разных баз данных (но с доступом от одного пользователя)

на 3.4 делал так

	$this->DB->build( array(    
    'select'    => 'm.member_id,g.guard_id,s.steamid ',
    'from'        => 'guard.ac_list g, forum.members m, steam.ac_status s',
    'where'        => ' 
    l.status = "1"  
    and g.member_id = g.guard_id
    and l.member_id = p.pp_member_id 
    and s.steamid = m.steamid ',
    'order'        => '`create` desc limit '.$start_from.', '.$limit.''
    ) );
    $this->DB->execute();
    while( $ac= $this->DB->fetch() ) {
    //Код...
    }

 

Как это воспроизвести на IPS4.5 ?

Ссылка на комментарий
Поделиться на другие сайты

перекопал базы движков.

по мне так это бред какой то.

Добрый день. А точней можно?

Ссылка на комментарий
Поделиться на другие сайты

HooLIGUN  

/**
	 * Build SELECT statement
	 *
	 * @param	array|string		$columns	The columns (as an array) to select or an expression
	 * @param	array|string		$table		The table to select from. Either (string) table_name or (array) ( name, alias ) or \IPS\Db\Select object
	 * @param	array|string|NULL	$where		WHERE clause - see \IPS\Db::compileWhereClause() for details
	 * @param	string|NULL			$order		ORDER BY clause
	 * @param	array|int			$limit		Rows to fetch or array( offset, limit )
	 * @param	string|NULL|array	$group		Column(s) to GROUP BY
	 * @param	array|string|NULL	$having		HAVING clause (same format as WHERE clause)
	 * @param	int					$flags		Bitwise flags
	 *	@li	\IPS\Db::SELECT_DISTINCT				Will use SELECT DISTINCT
	 *	@li	\IPS\Db::SELECT_MULTIDIMENSIONAL_JOINS	Will return the result as a multidimensional array, with each joined table separately
	 *	@li	\IPS\Db::SELECT_FROM_WRITE_SERVER		Will send the query to the write server (if read/write separation is enabled)
	 * @return	\IPS\Db\Select
	 *
	 */
	public function select( $columns=NULL, $table, $where=NULL, $order=NULL, $limit=NULL, $group=NULL, $having=NULL, $flags=0 )

 

// Get the select object
$select = \IPS\Db::i()->select( '*', 'some_table', array( 'field=?', 1 ), 'some_column DESC', array( 0, 10 ) );

// Force a specific index to be used for the query
$select = $select->forceIndex( 'some_index' );

// Join another table on
$select = $select->join( 'other_table_name', 'other_table_name.column=some_table.column', 'LEFT' );

// Now, get the number of results returned
$results = count( $select );

// Tell the iterator that keys should be 'column_a' and values should be 'column_b'
$select = $select->setKeyField( 'column_a' )->setValueField( 'column_b' );

// Finally, loop over the results
foreach( $select as $columnA => $columnB )
{
    print $columnA . ': ' . $columnB . '<br>';
}

 

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, SlawkA сказал:

перекопал базы движков.

по мне так это бред какой то.

Добрый день. А точней можно?

Добрый день. В движке такого быть не может, ибо он использует одну (свою) базу. 

у меня цель - получить информацию из разных БД одним запросом

Код из первого поста - рабочий вариант из версии 3.4

accop  пользуюсь этой докой, то что мне нужно - не работает

Если делать так

$select = \IPS\Db::i()->select( 'm.member_id,g.guard_id,s.steamid ', 'guard.list g,forum.members m,steam.list s', array( 'field=?', 1 )...

то запрос конструируется как \

select m.member_id,g.guard_id,s.steamid from `guard.list g,forum.members m,steam.list s`

а надо 

select m.member_id,g.guard_id,s.steamid from `guard`.`list` g,`forum`.`members` m,`steam`.`list` s

 

Ссылка на комментарий
Поделиться на другие сайты

Новое соединение по всей видимости строится так:

$newConnection = new \IPS\Db($host, $username, $password, $database, $port, $socket);

Дальше уже можно так:

$newConnection->select( $columns, $table, $where, $order, $limit );

 

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Respected сказал:

Новое соединение по всей видимости строится так:


$newConnection = new \IPS\Db($host, $username, $password, $database, $port, $socket);

Дальше уже можно так:


$newConnection->select( $columns, $table, $where, $order, $limit );

 

Я могу строить новое подключение, мне нужно в одном (текущем) подключении использовать несколько баз

select * from `db1`.`members`,`db2`.`members`,`db3`.`members` 

 

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, HooLIGUN сказал:

Если делать так

и 

4 часа назад, HooLIGUN сказал:

пользуюсь этой докой

не сочетается - потому что делаете не по доке.

например вы видите первый код с комментариями для построения запроса, при этом вы понятно что указываете в втором аргументе 

guard.list g,forum.members m,steam.list s

Если вам нужно просто выполнить запрос 

То согласно документации:

If you need to build an SQL statement and then return it instead of running it, you can set \IPS\Db::i()->returnQuery = TRUE before calling the driver to build a query.

To run a MySQL query that has been fully built already represented as a string, you can call the query() method.

\IPS\Db::i()->query( "UPDATE some_table SET field_a='value' WHERE id_field=1" );

You should typically avoid using the query() method directly, as the other built in methods automatically handle things like escaping values, prepending the database table prefix and so on.

 

HooLIGUN если у вас внешние подключения 

$connection = \IPS\Db::i( 'external', array(
    'sql_host'        => 'localhost',
    'sql_user'        => 'username',
    'sql_pass'        => 'password',
    'sql_database'    => 'database_name',
    'sql_port'        => 3306,
    'sql_socket'    => '/var/lib/mysql.sock',
    'sql_utf8mb4'    => true,
) );

 

Respected у тебя наверно старый метод. у 4 версии как я выше написал

Ссылка на комментарий
Поделиться на другие сайты

select
	l.row1,l.row2
	m.row1 ,
	p.pp_thumb_photo as avatar,
	s.date as lastdate
FROM	
 db1.ac_list l,db2.members m ,db2.profile_portal p,db1.ac_status s
where
	l.status = "1"  
	and l.row1 = m.row1 
	and l.row1 = p.row1 
	and s.member_id = l.member_id

Я наверное всех больше запутал)

accop , можете подсказать, как собрать этот запрос согласно доке?

 

Ссылка на комментарий
Поделиться на другие сайты

HooLIGUN как писал выше, ты можешь просто использовать чистый SQL в методе 

query
Ссылка на комментарий
Поделиться на другие сайты

accop Нет, мне нужно еще и вывести информацию по этому запросу

Ссылка на комментарий
Поделиться на другие сайты

HooLIGUN так 

$query = \IPS\Db::i()->query( ТВОЙ ЗАПРОС );

 

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, accop сказал:

HooLIGUN так 


$query = \IPS\Db::i()->query( ТВОЙ ЗАПРОС );

 

Да я понял. Я сначала не правильно вывел.

foreach ($select as $row)
{
	print_r ($row);
}

Сработало.

Спасибо!

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...