Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

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

 

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

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

тема: Пакет DENWER и подготовленные выражения
 
 автор: hk416   (27.09.2012 в 12:13)   письмо автору
 
 

Добрый день уважаемые коллеги. В общем захотел посмотреть что такое подготовленные выражения в MySQL, и решил их попробовать в Денвере, имеется на той базе что установилась с этим покетом, версия сервера базы там если я не ошибаюсь "5.0.7". В общем не фига не работает, даже вот такой примитивный примерчик. Пробовал я через phpmyadmin.


PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;


а вот это ответ сервера:


PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';# MySQL returned an empty result set (i.e. zero rows).

SET @a = 3;# MySQL returned an empty result set (i.e. zero rows).

SET @b = 4;# MySQL returned an empty result set (i.e. zero rows).

EXECUTE stmt1 USING @a, @b;# Rows: 1


Это пример из официальной документации, и он как мы знаем обязан работать даже за не именем какой либо существующей БД, нужен только сервер БД. Скажите, может что нитак, или для этих дела надо самому сервер mysql ставить и настраивать?


Через какое то время попробовал пример в консоли сервера БД, работает, но в phpmyadmin, результат что и выше. В чем же дело?

  Ответить  
 
 автор: cheops   (27.09.2012 в 16:36)   письмо автору
 
   для: hk416   (27.09.2012 в 12:13)
 

Вообще должно работать... возможно версия довольно старая 5.0.7 - это довольно старая версия, сейчас в ходу в районе 5.0.90... Прогнал пример работает и в консоли и в phpMyAdmin. Кроме того, у вас же пишется, что EXECUTE stmt1 USING @a, @b; возвращает одну строку (# Rows: 1 ) - её видно? Это должна быть строка с цифрой 5.

  Ответить  
 
 автор: hk416   (29.09.2012 в 06:03)   письмо автору
 
   для: cheops   (27.09.2012 в 16:36)
 

В общем я смотрю много проблем с этим серваком БД в Денвере, например набрал в консоли (mysql.exe) команду show databases; Он мне выдал что есть только две БД в наличие это information_schema и test. Хотя у меня уже больше БД, которые все есть в МайАдмине. К стати я до этого переустановил денвер, теперь там версия сервака 5.5. В общем подскажите плиз что делать. К стати процедура то у меня работала в консоли, и она сохранилась на серве, и в консоли её можно использовать многократно, а майадмин знать о ней ничего не знает.

Прогнал пример работает и в консоли и в phpMyAdmin. Кроме того, у вас же пишется, что EXECUTE stmt1 USING @a, @b; возвращает одну строку (# Rows: 1 ) - её видно? Это должна быть строка с цифрой 5.

Вот это все что он показывает к сожалению :
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';# MySQL returned an empty result set (i.e. zero rows).
SET @a =3;# MySQL returned an empty result set (i.e. zero rows).
SET @b =4;# MySQL returned an empty result set (i.e. zero rows).
EXECUTE stmt1 USING @a , @b ;# Rows: 1

  Ответить  
 
 автор: cheops   (29.09.2012 в 07:40)   письмо автору
 
   для: hk416   (29.09.2012 в 06:03)
 

Попробуйте поставить более свежую версию MySQL - её же можно поставить отдельно от Denwer.

  Ответить  
 
 автор: hk416   (01.10.2012 в 15:55)   письмо автору
 
   для: cheops   (29.09.2012 в 07:40)
 

В общем поставил последний денвер, и частично все это дело заработало, но к сожалению не все что хотелось, помогите ещё чуть чуть плизз, проверьте код.

В общем вот это вариант заработал. Понятное дело тут 3 разных варианта одного и тогоже же запроса, прямо демонстрация библиотеки mysqli. Код то что ниже благо работает.


$mysqli = new mysqli('localhost', 'root', '', 'forum_db_innodb_ZZZ'); 

/* Проверка соединения */ 
if (mysqli_connect_errno()) { 
    printf("Подключение невозможно: %s\n", mysqli_connect_error()); 
    exit(); 




$result = $mysqli->query("SELECT * FROM reg_users");  

while( $row = $result->fetch_assoc() )
{

    echo "<b> Логин ".$row[login]."</b><br />";
    echo "<b> Пароль ".$row[password]."</b><br />";
    echo "<b> ID  ".$row[id_user]."</b><br />";
    echo "<b> Статус  ".$row[status]."</b><br />";
    echo "<b> Дата ".$row[reg_date]."</b><br />";
}

$mysqli->query("PREPARE xxx FROM 'SELECT * FROM reg_users'"); 
$result2 = $mysqli->query("EXECUTE xxx"); 
while( $row = $result2->fetch_assoc() )
{

    echo "<b> Логин ".$row[login]."</b><br />";
    echo "<b> Пароль ".$row[password]."</b><br />";
    echo "<b> ID  ".$row[id_user]."</b><br />";
    echo "<b> Статус  ".$row[status]."</b><br />";
    echo "<b> Дата ".$row[reg_date]."</b><br />";
}

$c=1;

$mysqli->query("PREPARE zzz FROM 'SELECT * FROM reg_users WHERE id_user=?'"); 
$mysqli->query("SET @id=".$c);
$result3 = $mysqli->query("EXECUTE zzz USING @id");
while( $row = $result3->fetch_assoc() )
{
    echo "<b> Логин ".$row[login]."</b><br />";
    echo "<b> Пароль ".$row[password]."</b><br />";
    echo "<b> ID  ".$row[id_user]."</b><br />";
    echo "<b> Статус  ".$row[status]."</b><br />";
    echo "<b> Дата ".$row[reg_date]."</b><br />";
    
}



Но меня больше интересует вот это вариант и у меня к сожалению он вообще не работает. Разницу между тем что выше и тем что ниже вы наверняка знаете, код разный но цель у него одна и та же, просто хочу писать подготовленные запросы техникой той что ниже. Посмотрите его плизззз.


$mysqli = new mysqli('localhost', 'root', '', 'forum_db_innodb_ZZZ'); 

/* Проверка соединения */ 
if (mysqli_connect_errno()) { 
    printf("Подключение невозможно: %s\n", mysqli_connect_error()); 
    exit(); 



$id =1; 
$stmt = $mysqli->prepare("SELECT * FROM reg_users WHERE id_user=?"); 
$stmt->bind_param($id); 
$stmt->store_result();


$stmt->execute(); 

while($row = $stmt->fetch_array())
{
    echo "<b> Логин ".$row[login]."</b><br />";
    echo "<b> Пароль ".$row[password]."</b><br />";
    echo "<b> ID  ".$row[id_user]."</b><br />";
    echo "<b> Статус  ".$row[status]."</b><br />";
    echo "<b> Дата ".$row[reg_date]."</b><br />";
}


$stmt->close(); 



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


$mysqli = new mysqli('localhost', 'root', '', 'forum_db_innodb_ZZZ'); 

/* Проверка соединения */ 
if (mysqli_connect_errno()) { 
    printf("Подключение невозможно: %s\n", mysqli_connect_error()); 
    exit(); 


$query = "SELECT * FROM reg_users";
if($stmt = $mysqli->prepare("SELECT * FROM reg_users")) echo "max";
    else echo "max2";

$mysqli->close();

  Ответить  
 
 автор: cheops   (01.10.2012 в 16:26)   письмо автору
 
   для: hk416   (01.10.2012 в 15:55)
 

Вам после выполнения метода execute() нужно выполнить метод bind_result(), чтобы привязать результат к нужной переменной, после чего вы сможете воспользоваться методом fetch().

PS Лучше, конечно, пользоваться расширением PDO, которое, кстати, тоже поддерживает подготовленные выражения и позволяет гораздо лучше контролировать параметры.

  Ответить  
 
 автор: Sfinks   (02.10.2012 в 10:47)   письмо автору
 
   для: hk416   (01.10.2012 в 15:55)
 

А вам что, ошибок никаких не вылетает?
bind_param() должна принимать минимум 2 параметра:
bool mysqli_stmt::bind_param ( string $types , mixed &$var1 [, mixed &$... ] )
, где
types
A string that contains one or more characters which specify the types for the corresponding bind variables:
Type specification chars
i  corresponding variable has type integer
d  corresponding variable has type double
s  corresponding variable has type string
b  corresponding variable is a blob and will be sent in packets

Ну и пример из мана:
<?php
$mysqli 
= new mysqli('localhost''my_user''my_password''world');

/* check connection */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

$stmt $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd'$code$language$official$percent);

$code 'DEU';
$language 'Bavarian';
$official "F";
$percent 11.2;

/* execute prepared statement */
$stmt->execute();

printf("%d Row inserted.\n"$stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n"$mysqli->affected_rows);

/* close connection */
$mysqli->close();

Ну и - да - не забывайте про stmt::bind_result()

  Ответить  
 
 автор: hk416   (02.10.2012 в 11:32)   письмо автору
 
   для: Sfinks   (02.10.2012 в 10:47)
 

В общем подправил строку в своём скрипте с учетом ваших замечаний, все равно не пашет, а мануал тот тупой, я его 1000 раз видел, именно с тем примером. Там нету не одного примера скажем в запросе без параметров. В общем не знаю где ошибку искать, можете мой пример у себя запустить? Там всего лишь один SELCT, с одним параметром.


$stmt->bind_param('i',$id); 

  Ответить  
 
 автор: Sfinks   (02.10.2012 в 13:34)   письмо автору
 
   для: hk416   (02.10.2012 в 11:32)
 

Вы показ ошибок включите или в php.ini или в начале скрипта:
error_reporting(E_ALL);
и увидите ошибку:
Fatal error: Call to undefined method mysqli_stmt::fetch_array() in ...

Ее смысл понятен?

А вот так:
<?php
  $mysqli 
= new mysqli('localhost''root''''test');  
  
$stmt $mysqli->prepare("SELECT name FROM catalog WHERE id_catalog=?");  
  
$stmt->bind_param('i',$id);  
  
$id 1;  
  
$stmt->execute();  
  
$stmt->bind_result($name); 
  
$stmt->fetch();
  
printf("%d => %s<br>"$id$name);
все работает!

Заметьте - все четко по тупому ману!

  Ответить  
 
 автор: hk416   (02.10.2012 в 16:02)   письмо автору
 
   для: Sfinks   (02.10.2012 в 13:34)
 

В общем спасибо за скрипт что такое у меня там заработало, но во первых напишите плиз вариант вашего скрипта без параметров вот с таким запросом


$stmt = $mysqli->prepare("SELECT * FROM catalog");


И хотелось бы понять работает ли в нашем случае вот эта штука или нет http://www.php.net/manual/ru/mysqli-result.fetch-assoc.php если можно вставьте её в ваш пример, у меня есть чувство что вы в этом разбираетесь в отличие от меня.

  Ответить  
 
 автор: Sfinks   (02.10.2012 в 18:16)   письмо автору
 
   для: hk416   (02.10.2012 в 16:02)
 

Я с подготовленными выражениями не работаю.
Разбираться не очень есть время.
Но можно так, например:
<?php
  $mysqli 
= new mysqli('localhost''root''''test');  
  
$stmt $mysqli->prepare("SELECT * FROM catalog");  
  
$stmt->bind_result($f1,$f2);     // <-- столько же переменных, сколько возвращается полей
  
$stmt->execute();  
  while(
$stmt->fetch())
    {
    echo
"<pre>";var_dump($f1,$f2);echo"</pre>";
    }

> И хотелось бы понять работает ли в нашем случае вот эта штука или нет
Работает, но надо понимать разницу между mysqli_stmt и mysqli_result. Т.е. оно к подготовленным выражениям не имеет никакого отношения.

> если можно вставьте её в ваш пример
Например так:
<?php
  $mysqli 
= new mysqli('localhost''root''''test');  
  
$res $mysqli->query("SELECT * FROM catalog");  
  while(
$row $res->fetch_assoc())
    {
    echo
"<pre>";var_dump($row);echo"</pre>";
    }

  Ответить  
 
 автор: hk416   (03.10.2012 в 18:01)   письмо автору
 
   для: Sfinks   (02.10.2012 в 18:16)
 

В общем спасибо, я проверил конечно работает но такая техника конечно не в какое место ....... Ну ладно будем пользоваться той которой научился, а именно той что скрипты в начале и PDO по совету тоже надо посмотреть.

С этим кодом все понятно у меня как раз такие же скрипты уже есть, они там в начале.


  $mysqli = new mysqli('localhost', 'root', '', 'test');   
  $res = $mysqli->query("SELECT * FROM catalog");   
  while($row = $res->fetch_assoc()) 
    { 
    echo"<pre>";var_dump($row);echo"</pre>"; 
    }

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

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