|
|
|
| Здравствуйте. Есть такая задача. У меня имеется следующий код:
$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 в 10:51)
| | UP | |
|
|
|
|
|
|
|
для: pavluxa09
(11.07.2010 в 10:51)
| | Класс вы писали? Значит вам и карты в руки.
Интересно - ID уникальное? Если уникальное, то зачем LIMIT 1?
Подготовленный запрос, если запросить, возвращает ресурс, а вот как он у вас дальше обрабатывается и что возвращается, смотрите в классе своем. | |
|
|
|
|
|
|
|
для: sim5
(11.07.2010 в 14:24)
| | Класс MYSQLi серверный :) Я не могу его переписать :) | |
|
|
|
|
|
|
|
для: pavluxa09
(11.07.2010 в 16:16)
| | Но а кто вам скажет что делать, если что и как делает этот класс не известно? Читайте о нем, если есть что, возможно возвращаемое зависит от обращения к нему. Что-то же это означает:
$query->bind_param( "d",$RequestID ); | |
|
|
|
|
|
|
|
для: sim5
(11.07.2010 в 16:32)
| | В смысле? $mysqli = new mysqli( DB_HOST,DB_USER,DB_PASS,DB_NAME ); | |
|
|
|
|
|
|
|
для: pavluxa09
(11.07.2010 в 17:48)
| | Это к чемы вы написали? | |
|
|
|
|
|
|
|
для: 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 записывать сначало в подготовительный запрос, ну чтоб не взломали. | |
|
|
|
|
|
|
|
для: pavluxa09
(11.07.2010 в 20:33)
| | Я пониятия не имею о классе mysqli, но методы "безопасности" должны быть тками же. Единственное, что могу сказать по вышеприведенному запросу, ID надо полагать номер, а коли так, то intval(значение) для ID в запросе. Вот только тема начиналась совсем с другого вопроса нежели у нынешнего поста.
Вы все таки можете объяснить назначение в обех ваших запросах LIMIT 1?
В первом запросе ID не уникально?
Во втором запросе name также не уникально? | |
|
|
|
|
|
|
|
для: sim5
(11.07.2010 в 20:55)
| | Уникально, это так чтоб было :) Вопрос остается открытым, так как ответа на сайте PHP я не нашел, можно прицепить переменные в которые будут записываться результат, но если их количество не равно количеству возвращаемых полей то ошибка, хотелось бы что бы оно записывало в массив а не в каждую переменную отдельно, это метод bind_result, в которые передаются ссылки на переменные в которые будут записаны результаты, вот еслиб она массив принимало и записывало в него было бы супер, я это и ищю, так как в простом MYSQL есть mysql_fetch_assoc, а здесь есть fetch_assoc но только если выполняется запрос методом query, а у меня подготовительное выражение, у него нету. | |
|
|
|
|
|
|
|
для: pavluxa09
(11.07.2010 в 23:34)
| | Судя по описанию класса все там есть.
Запрос по уникальному id или уникальному имени, вернет только одну запись, на то оно и уникальное, поэтому LIMIT 1 в запросе как собаке пятая лапа. | |
|
|
|
|
|
|
|
для: sim5
(11.07.2010 в 20:55)
| | Почаще в мануал нужно заглядывать :) | |
|
|
|
|
|
|
|
для: Саня
(11.07.2010 в 23:55)
| | Да он мне и даром не нужен класс этот, ну вот пришлось заглянуть. :) | |
|
|
|
|
|
|
|
для: 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>";
}
|
| |
|
|
|
|
|
|
|
для: Саня
(12.07.2010 в 00:15)
| | Прошу обратить внимание на $query->bind_result($field1, $field2, .. и так далее по количеству столбцов в выборке); , всё дело в том, что она принимает ссылки на переменные в которые будут записывать результат, и если запрос вернёт не такое же количество то будет FATAL ERROR. Мне нужно что бы она принимала массив, в котором индексом было название столбика, а значением его значение.
Как мне это сделать? Если не использовать подготовительные выражения то там есть функция fetch_assoc, которая именно так и делает, но сдесь её нет :( Может можно как то привести к типу query эту хрень? | |
|
|
|
|
|
|
|
|
для: 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;
}
|
При её вызове
На мониторе мы видим следующий код в непонятной кодировке:
Array
(
[ID] =>
[CreateDate] =>
[UpdateDate] =>
[FromCurrency] => �
[ToCurrency] =>
[FromAmount] =>
[ToAmount] => Ъ &&
[CustomerWMID] => Ъ &(
[CustomerEmail] => WMZ
[FromPurse] => WMR
[ToPurse] =>
[X2Retval] =>
[Status] =>
)
|
Но в тоже время, под 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
|
Как это можно обяснить? Почему так? Я пробывал устанавливать кодировку соединения это не помогло! Возможно это кривые руки программиста, если да помогите исправить, но возможно это мистика означающая конец света... Ну почему??? | |
|
|
|
|
|
|
|
для: pavluxa09
(12.07.2010 в 13:14)
| | откуда вырос LIMIT 1 ? | |
|
|
|
|
|
|
|
для: Trianon
(12.07.2010 в 14:12)
| | Убрал. Не помогло.
Вот какой массив возвращает:
Array ( [ID] => [CreateDate] => [UpdateDate] => [FromCurrency] => � [ToCurrency] => [FromAmount] => [ToAmount] => Ъ && [CustomerWMID] => Ъ &( [CustomerEmail] => WMZ [FromPurse] => WMR [ToPurse] => [X2Retval] => [Status] => )
|
Т.е не видит цифры и дату | |
|
|
|
|
|
|
|
для: pavluxa09
(12.07.2010 в 14:15)
| | то есть ассоциативный массив возвращается.
ну а касаемо содержимого - так это фиг знает, что у Вас там в таблице лежит...
Дамп-то Вы не привели.
И кстати, если Вам это нужно с практической целью, пошто Вас не устраивает любой другой способ получения результата? | |
|
|
|
|
|
|
|
для: 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, чтоб с фильтрованием данных. | |
|
|
|
|
|
|
|
для: pavluxa09
(12.07.2010 в 19:53)
| | А метод store_result вместо use_result дает тот же результат? | |
|
|
|
|
|
|
|
для: Trianon
(12.07.2010 в 23:04)
| | К сожалению да, ещё хуже, он ещё и перепутывает значение местами.
Да и user_result перепутывает их местами... | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: pavluxa09
(13.07.2010 в 16:56)
| | Да понял я, понял.
К слову сказать, у меня каменный цветок тоже не выходит... | |
|
|
|
|
|
|
|
для: Trianon
(14.07.2010 в 10:16)
| | А как быть если запрос возвращает несколько строк? | |
|
|
|
|
|
|
|
для: pavluxa09
(14.07.2010 в 13:04)
| | да так же, собственно, как и с клиентом обычным клиентом php_mysql.
$stmt->fetch() можно вызывать столько раз, сколько нужно.
Если ряды вычерпаны, очередной вызов вернет null . | |
|
|
|
|
|
|
|
для: 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_dump( Search( 1 ) );
|
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)
}
|
| |
|
|
|
|
|
|
|
для: Trianon
(14.07.2010 в 10:43)
| | Уря!!! Спасибо! Вы настоящий программист!!!! | |
|
|
|
|
|
|
|
для: pavluxa09
(14.07.2010 в 11:37)
| | Теперь ещё и резчик по камню :) | |
|
|
|
|
|
|
|
для: Trianon
(14.07.2010 в 10:43)
| | Это и есть "плюсы" библиотеки этой. :) | |
|
|
|