|
|
|
| Добрый день уважаемые коллеги. В общем захотел посмотреть что такое подготовленные выражения в 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, результат что и выше. В чем же дело? | |
|
|
|
|
|
|
|
для: hk416
(27.09.2012 в 12:13)
| | Вообще должно работать... возможно версия довольно старая 5.0.7 - это довольно старая версия, сейчас в ходу в районе 5.0.90... Прогнал пример работает и в консоли и в phpMyAdmin. Кроме того, у вас же пишется, что EXECUTE stmt1 USING @a, @b; возвращает одну строку (# Rows: 1 ) - её видно? Это должна быть строка с цифрой 5. | |
|
|
|
|
|
|
|
для: 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
| |
|
|
|
|
|
|
|
для: hk416
(29.09.2012 в 06:03)
| | Попробуйте поставить более свежую версию MySQL - её же можно поставить отдельно от Denwer. | |
|
|
|
|
|
|
|
для: 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();
|
| |
|
|
|
|
|
|
|
для: hk416
(01.10.2012 в 15:55)
| | Вам после выполнения метода execute() нужно выполнить метод bind_result(), чтобы привязать результат к нужной переменной, после чего вы сможете воспользоваться методом fetch().
PS Лучше, конечно, пользоваться расширением PDO, которое, кстати, тоже поддерживает подготовленные выражения и позволяет гораздо лучше контролировать параметры. | |
|
|
|
|
|
|
|
для: 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() | |
|
|
|
|
|
|
|
для: Sfinks
(02.10.2012 в 10:47)
| | В общем подправил строку в своём скрипте с учетом ваших замечаний, все равно не пашет, а мануал тот тупой, я его 1000 раз видел, именно с тем примером. Там нету не одного примера скажем в запросе без параметров. В общем не знаю где ошибку искать, можете мой пример у себя запустить? Там всего лишь один SELCT, с одним параметром.
$stmt->bind_param('i',$id);
|
| |
|
|
|
|
|
|
|
для: hk416
(02.10.2012 в 11:32)
| | Вы показ ошибок включите или в php.ini или в начале скрипта: и увидите ошибку:
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);
| все работает!
Заметьте - все четко по тупому ману! | |
|
|
|
|
|
|
|
для: Sfinks
(02.10.2012 в 13:34)
| | В общем спасибо за скрипт что такое у меня там заработало, но во первых напишите плиз вариант вашего скрипта без параметров вот с таким запросом
$stmt = $mysqli->prepare("SELECT * FROM catalog");
|
И хотелось бы понять работает ли в нашем случае вот эта штука или нет http://www.php.net/manual/ru/mysqli-result.fetch-assoc.php если можно вставьте её в ваш пример, у меня есть чувство что вы в этом разбираетесь в отличие от меня. | |
|
|
|
|
|
|
|
для: 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>";
}
|
| |
|
|
|
|
|
|
|
для: 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>";
}
|
| |
|
|
|
|