Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Получения данных после выполнения подготовительного выражения MYSQLi
 
 автор: pavluxa09   (11.07.2010 в 10:51)   письмо автору
 
 

Здравствуйте. Есть такая задача. У меня имеется следующий код:

$query = $mysqli->prepare( "SELECT * FROM `ex_requests` WHERE `ID` = ? LIMIT 1" );
$query->bind_param( "d",$RequestID );
$query->execute();


Мне нужно вернуть массив данных после выполнения данного запроса, а если нет строки то false. Если бы запрос был не подготовительный а $mysqli->query, то я бы сделал return $query->fetch_assoc(), но в подготовительном запросе это не прокатывает, как сделать чтоб вернуло весь массив, независимо от количество полей?

Заранее спасибо

  Ответить  
 
 автор: pavluxa09   (11.07.2010 в 13:57)   письмо автору
 
   для: pavluxa09   (11.07.2010 в 10:51)
 

UP

  Ответить  
 
 автор: sim5   (11.07.2010 в 14:24)   письмо автору
 
   для: pavluxa09   (11.07.2010 в 10:51)
 

Класс вы писали? Значит вам и карты в руки.
Интересно - ID уникальное? Если уникальное, то зачем LIMIT 1?
Подготовленный запрос, если запросить, возвращает ресурс, а вот как он у вас дальше обрабатывается и что возвращается, смотрите в классе своем.

  Ответить  
 
 автор: pavluxa09   (11.07.2010 в 16:16)   письмо автору
 
   для: sim5   (11.07.2010 в 14:24)
 

Класс MYSQLi серверный :) Я не могу его переписать :)

  Ответить  
 
 автор: sim5   (11.07.2010 в 16:32)   письмо автору
 
   для: pavluxa09   (11.07.2010 в 16:16)
 

Но а кто вам скажет что делать, если что и как делает этот класс не известно? Читайте о нем, если есть что, возможно возвращаемое зависит от обращения к нему. Что-то же это означает:
$query->bind_param( "d",$RequestID );

  Ответить  
 
 автор: pavluxa09   (11.07.2010 в 17:48)   письмо автору
 
   для: sim5   (11.07.2010 в 16:32)
 

В смысле? $mysqli = new mysqli( DB_HOST,DB_USER,DB_PASS,DB_NAME );

  Ответить  
 
 автор: sim5   (11.07.2010 в 18:06)   письмо автору
 
   для: pavluxa09   (11.07.2010 в 17:48)
 

Это к чемы вы написали?

  Ответить  
 
 автор: pavluxa09   (11.07.2010 в 20:33)   письмо автору
 
   для: sim5   (11.07.2010 в 18:06)
 

Здравствуйте. Я пишу скрипт на PHP, раньше я работал с базой при помощи функций mysql (mysql_connect,mysql_query, и т.д), можно было сделать следующую штуку:


mysql_connect( 'host','user','pass' );
mysql_select_db( 'base' );
function GetMyArray( $param )
{
$query = mysql_query( "SELECT * FROM `table` WHERE `name` = '".mysql_real_escape_string( $param )."' LIMIT 1" );
return mysql_fetch_assoc( $query );
}
print_r( GetMyArray() );

В результате данного кода у меня функция возвращала массив данных или false. Как мне теперь этот код написать при помощи класса mysqli, чтобы $param записывать сначало в подготовительный запрос, ну чтоб не взломали.

  Ответить  
 
 автор: sim5   (11.07.2010 в 20:55)   письмо автору
 
   для: pavluxa09   (11.07.2010 в 20:33)
 

Я пониятия не имею о классе mysqli, но методы "безопасности" должны быть тками же. Единственное, что могу сказать по вышеприведенному запросу, ID надо полагать номер, а коли так, то intval(значение) для ID в запросе. Вот только тема начиналась совсем с другого вопроса нежели у нынешнего поста.
Вы все таки можете объяснить назначение в обех ваших запросах LIMIT 1?
В первом запросе ID не уникально?
Во втором запросе name также не уникально?

  Ответить  
 
 автор: pavluxa09   (11.07.2010 в 23:34)   письмо автору
 
   для: sim5   (11.07.2010 в 20:55)
 

Уникально, это так чтоб было :) Вопрос остается открытым, так как ответа на сайте PHP я не нашел, можно прицепить переменные в которые будут записываться результат, но если их количество не равно количеству возвращаемых полей то ошибка, хотелось бы что бы оно записывало в массив а не в каждую переменную отдельно, это метод bind_result, в которые передаются ссылки на переменные в которые будут записаны результаты, вот еслиб она массив принимало и записывало в него было бы супер, я это и ищю, так как в простом MYSQL есть mysql_fetch_assoc, а здесь есть fetch_assoc но только если выполняется запрос методом query, а у меня подготовительное выражение, у него нету.

  Ответить  
 
 автор: sim5   (11.07.2010 в 23:57)   письмо автору
 
   для: pavluxa09   (11.07.2010 в 23:34)
 

Судя по описанию класса все там есть.
Запрос по уникальному id или уникальному имени, вернет только одну запись, на то оно и уникальное, поэтому LIMIT 1 в запросе как собаке пятая лапа.

  Ответить  
 
 автор: Саня   (11.07.2010 в 23:55)   письмо автору
 
   для: sim5   (11.07.2010 в 20:55)
 

Почаще в мануал нужно заглядывать :)

  Ответить  
 
 автор: sim5   (11.07.2010 в 23:58)   письмо автору
 
   для: Саня   (11.07.2010 в 23:55)
 

Да он мне и даром не нужен класс этот, ну вот пришлось заглянуть. :)

  Ответить  
 
 автор: Саня   (12.07.2010 в 00:15)   письмо автору
 
   для: pavluxa09   (11.07.2010 в 10:51)
 

Мануал внимательнее читать надо:
<?
$query 
$mysqli->prepare"SELECT * FROM `ex_requests` WHERE `ID` = ? LIMIT 1" ); 
$query->bind_param"d",$RequestID ); 
$query->execute();
$query->bind_result($field1$field2, .. и так далее по количеству столбцов в выборке);
while ( 
$query->fetch() ) {
  print 
$field1." ".$field2."<br>";
}

  Ответить  
 
 автор: pavluxa09   (12.07.2010 в 10:29)   письмо автору
 
   для: Саня   (12.07.2010 в 00:15)
 

Прошу обратить внимание на $query->bind_result($field1, $field2, .. и так далее по количеству столбцов в выборке); , всё дело в том, что она принимает ссылки на переменные в которые будут записывать результат, и если запрос вернёт не такое же количество то будет FATAL ERROR. Мне нужно что бы она принимала массив, в котором индексом было название столбика, а значением его значение.
Как мне это сделать? Если не использовать подготовительные выражения то там есть функция fetch_assoc, которая именно так и делает, но сдесь её нет :( Может можно как то привести к типу query эту хрень?

  Ответить  
 
 автор: Trianon   (12.07.2010 в 12:05)   письмо автору
 
   для: pavluxa09   (12.07.2010 в 10:29)
 

http://ru2.php.net/manual/en/mysqli.use-result.php
http://ru2.php.net/manual/en/mysqli-result.fetch-assoc.php

  Ответить  
 
 автор: pavluxa09   (12.07.2010 в 13:14)   письмо автору
 
   для: Trianon   (12.07.2010 в 12:05)
 

В результате получилась адская функция:

function Search( $RequestID )
{
        global $mysqli;

          $query = $mysqli->stmt_init();
        if( $query->prepare( "SELECT * FROM `ex_requests` WHERE `ID` = ? LIMIT 1" ) )
        {
            $query->bind_param( "d",$RequestID );
            $query->execute();
            $result = $mysqli->use_result();
            $result = $result->fetch_assoc();
            $query->close();
            return $result;
        }
        return false;
}


При её вызове

print_r( Search( 1 ) );

На мониторе мы видим следующий код в непонятной кодировке:

Array
(
    [ID] =&gt; 
    [CreateDate] =&gt; 
    [UpdateDate] =&gt; 
    [FromCurrency] =&gt; &#65533;
    [ToCurrency] =&gt; 
    [FromAmount] =&gt; 
    [ToAmount] =&gt; Ъ     &amp;&amp;

    [CustomerWMID] =&gt; Ъ     &amp;(
    [CustomerEmail] =&gt; WMZ
    [FromPurse] =&gt; WMR
    [ToPurse] =&gt; 
    [X2Retval] =&gt; 
    [Status] =&gt; 
)  


Но в тоже время, под ID 1 в таблице храниться строка вида:

ID     CreateDate     UpdateDate     FromCurrency     ToCurrency     FromAmount     ToAmount     CustomerWMID     CustomerEmail     FromPurse     ToPurse     X2Retval     Status

1     2010-07-11 09:38:38     2010-07-11 09:38:40     WMZ     WMR     10     500     000000000000     pazha@gmail.ru     Z000000000000     R000000000000     0     1


Как это можно обяснить? Почему так? Я пробывал устанавливать кодировку соединения это не помогло! Возможно это кривые руки программиста, если да помогите исправить, но возможно это мистика означающая конец света... Ну почему???

  Ответить  
 
 автор: Trianon   (12.07.2010 в 14:12)   письмо автору
 
   для: pavluxa09   (12.07.2010 в 13:14)
 

откуда вырос LIMIT 1 ?

  Ответить  
 
 автор: pavluxa09   (12.07.2010 в 14:15)   письмо автору
 
   для: Trianon   (12.07.2010 в 14:12)
 

Убрал. Не помогло.
Вот какой массив возвращает:

Array ( [ID] => [CreateDate] => [UpdateDate] => [FromCurrency] => &#65533; [ToCurrency] => [FromAmount] => [ToAmount] => Ъ  &&  [CustomerWMID] => Ъ  &( [CustomerEmail] => WMZ [FromPurse] => WMR [ToPurse] => [X2Retval] => [Status] => ) 


Т.е не видит цифры и дату

  Ответить  
 
 автор: Trianon   (12.07.2010 в 15:23)   письмо автору
 
   для: pavluxa09   (12.07.2010 в 14:15)
 

то есть ассоциативный массив возвращается.
ну а касаемо содержимого - так это фиг знает, что у Вас там в таблице лежит...
Дамп-то Вы не привели.

И кстати, если Вам это нужно с практической целью, пошто Вас не устраивает любой другой способ получения результата?

  Ответить  
 
 автор: pavluxa09   (12.07.2010 в 19:53)   письмо автору
 
   для: Trianon   (12.07.2010 в 15:23)
 

Вот дамб базы:


CREATE TABLE IF NOT EXISTS `ex_requests` (
  `ID` int(11) NOT NULL,
  `CreateDate` datetime NOT NULL,
  `UpdateDate` datetime NOT NULL,
  `FromCurrency` varchar(3) NOT NULL,
  `ToCurrency` varchar(3) NOT NULL,
  `FromAmount` double NOT NULL,
  `ToAmount` double NOT NULL,
  `CustomerWMID` varchar(12) NOT NULL,
  `CustomerEmail` varchar(109) NOT NULL,
  `FromPurse` varchar(13) NOT NULL,
  `ToPurse` varchar(13) NOT NULL,
  `X2Retval` int(11) default '0',
  `Status` int(1) default '1',
  PRIMARY KEY  (`ID`),
  KEY `FromCurrency` (`FromCurrency`,`ToCurrency`,`CustomerWMID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO `ex_requests` (`ID`, `CreateDate`, `UpdateDate`, `FromCurrency`, `ToCurrency`, `FromAmount`, `ToAmount`, `CustomerWMID`, `CustomerEmail`, `FromPurse`, `ToPurse`, `X2Retval`, `Status`) VALUES
(1, '2010-07-11 09:38:38', '2010-07-11 09:38:40', 'WMZ', 'WMR', 10, 500, '000000000000', '444@gmail.ru', 'Z000000000000', 'R000000000000', 0, 1);


Не устраевает так как нада через MYSQLi, чтоб с фильтрованием данных.

  Ответить  
 
 автор: Trianon   (12.07.2010 в 23:04)   письмо автору
 
   для: pavluxa09   (12.07.2010 в 19:53)
 

А метод store_result вместо use_result дает тот же результат?

  Ответить  
 
 автор: pavluxa09   (13.07.2010 в 10:34)   письмо автору
 
   для: Trianon   (12.07.2010 в 23:04)
 

К сожалению да, ещё хуже, он ещё и перепутывает значение местами.
Да и user_result перепутывает их местами...

  Ответить  
 
 автор: pavluxa09   (13.07.2010 в 16:56)   письмо автору
 
   для: pavluxa09   (13.07.2010 в 10:34)
 

Вот как они пишут в примерах:

$query = "SELECT Name, CountryCode FROM City ORDER by ID DESC LIMIT 50,5";

if ($result = mysqli_query($link, $query)) {

    /* fetch associative array */
    while ($row = mysqli_fetch_row($result)) {
        printf ("%s (%s)\n", $row[0], $row[1]);
    }

    /* free result set */
    mysqli_free_result($result);
}


А я хочу место mysqli_query использовать подготовительное выражение, что бы отфильтровать переменную которую я засуну в оператор WHERE.

  Ответить  
 
 автор: Trianon   (14.07.2010 в 10:16)   письмо автору
 
   для: pavluxa09   (13.07.2010 в 16:56)
 

Да понял я, понял.
К слову сказать, у меня каменный цветок тоже не выходит...

  Ответить  
 
 автор: pavluxa09   (14.07.2010 в 13:04)   письмо автору
 
   для: Trianon   (14.07.2010 в 10:16)
 

А как быть если запрос возвращает несколько строк?

  Ответить  
 
 автор: Trianon   (14.07.2010 в 15:35)   письмо автору
 
   для: pavluxa09   (14.07.2010 в 13:04)
 

да так же, собственно, как и с клиентом обычным клиентом php_mysql.
$stmt->fetch() можно вызывать столько раз, сколько нужно.
Если ряды вычерпаны, очередной вызов вернет null .

  Ответить  
 
 автор: Trianon   (14.07.2010 в 10:43)   письмо автору
 
   для: pavluxa09   (13.07.2010 в 16:56)
 

Хо-хо!
А я таки всё ж ея добил :))
<?

function Search$RequestID )
{
        global 
$mysqli;

          
$sql "SELECT * FROM `ex_requests` WHERE `ID` = ?";
          
$stmt $mysqli->stmt_init();
          if( 
$result $stmt->prepare$sql ) )
          {
            
$stmt->bind_param"d",$RequestID );
            
$stmt->execute();
            
$result $stmt->result_metadata();
            
$fields $result->fetch_fields();

            
$res_arr = array();   $list = array();
            foreach(
$fields as $f)
                    
$list[] = &$res_arr[$f->name];
            if(!
call_user_func_array(array($stmt'bind_result'), $list))
                    return 
"bind result error: ".$stmt->error;

            
$f $stmt->fetch();
            if(
$f === false)
              return 
"fetch error: ".$stmt->error;
            if(
$f === null)
              return 
null;
            return 
$res_arr;
        }
        return 
mysqli_error($mysqli);
}

var_dumpSearch) ); 



array(13) {
  ["ID"]=>
  int(1)
  ["CreateDate"]=>
  string(19) "2010-07-11 09:38:38"
  ["UpdateDate"]=>
  string(19) "2010-07-11 09:38:40"
  ["FromCurrency"]=>
  string(3) "WMZ"
  ["ToCurrency"]=>
  string(3) "WMR"
  ["FromAmount"]=>
  float(10)
  ["ToAmount"]=>
  float(500)
  ["CustomerWMID"]=>
  string(12) "000000000000"
  ["CustomerEmail"]=>
  string(12) "444@gmail.ru"
  ["FromPurse"]=>
  string(13) "Z000000000000"
  ["ToPurse"]=>
  string(13) "R000000000000"
  ["X2Retval"]=>
  int(0)
  ["Status"]=>
  int(1)
}


  Ответить  
 
 автор: pavluxa09   (14.07.2010 в 11:37)   письмо автору
 
   для: Trianon   (14.07.2010 в 10:43)
 

Уря!!! Спасибо! Вы настоящий программист!!!!

  Ответить  
 
 автор: Valick   (14.07.2010 в 11:55)   письмо автору
 
   для: pavluxa09   (14.07.2010 в 11:37)
 

Теперь ещё и резчик по камню :)

  Ответить  
 
 автор: sim5   (14.07.2010 в 12:35)   письмо автору
 
   для: Trianon   (14.07.2010 в 10:43)
 

Это и есть "плюсы" библиотеки этой. :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования