Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PDO проблема, bindParam работает непонятно 
V
    Опции темы
Veve
Дата 30.11.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 3
Всего: 13



Привет, совсем замучался. Либо не высполся, либо уже вообще ничего не понимаю. 

Этот код работает правильно. Запрос выполняется.

Код

$sth=PDO::prepare("SELECT * FROM   users WHERE  login=:login and password=:password");

$this->bindParams['value'][':login']='worker';
$this->bindParams['value'][':password']='b61822e8357dcaff77eaaccf348d9134';

if (isset($this->bindParams))
               foreach ($this->bindParams['value'] as $key => $value)        
                    $sth->bindParam($key, $this->bindParams['value'][$key],2 );


А так уже не работает: 


Код

$sth=PDO::prepare("SELECT * FROM   users WHERE  login=:login and password=:password");

$this->bindParams['value'][':login']='worker';
$this->bindParams['value'][':password']='b61822e8357dcaff77eaaccf348d9134';

if (isset($this->bindParams))
               foreach ($this->bindParams['value'] as $key => $value)        
                    $sth->bindParam($key, $value,2 );



Что за хрень?



PM MAIL ICQ Skype MSN   Вверх
NewDima
Дата 30.11.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



дебаж. Поставь вместо $sth->bindParam var_dump
PM ICQ   Вверх
Simpliest
Дата 30.11.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Осталось выяснить причем тут PDO и приведенный код.
Если не работает в другом месте.


--------------------
user posted image
PM   Вверх
Veve
Дата 30.11.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 3
Всего: 13



Цитата

дебаж. Поставь вместо $sth->bindParam var_dump 


var_dump для $this->bindParams['value'][$key] и для $value
абсолютно идентичны

Цитата

Осталось выяснить причем тут PDO и приведенный код.
Если не работает в другом месте. 


В каком месте у тебя не работает? 

$sth->bindParam () это метод pdostatement`a  и туда передаются одинаковые значения, где по твоему ошибка? 

Это сообщение отредактировал(а) Veve - 30.11.2009, 13:51
PM MAIL ICQ Skype MSN   Вверх
Simpliest
Дата 30.11.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(Veve @  30.11.2009,  12:50 Найти цитируемый пост)

В каком месте у тебя не работает? 
...
где по твоему ошибка? 

Понятия не имею. Код ведь весь у тебя smile

Я просто знаю что
Цитата(Veve @  30.11.2009,  12:50 Найти цитируемый пост)
var_dump для $this->bindParams['value'][$key] и для $value
абсолютно идентичны


А значит ошибка не тут.



--------------------
user posted image
PM   Вверх
Veve
Дата 30.11.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 3
Всего: 13



Дорогие коллеги, чтобы не быть единоличникам обладающим всем кодом, ниже привожу ВЕСЬ исходник. В надежде услышать хоть что-то более или менее вразумительное.

Код

<?php

$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$stmt=$db->prepare("SELECT * FROM   test WHERE  id=:id and name=:name");
$bindParams['value'][':id']='1';
$bindParams['value'][':name']='name1';
if (isset($bindParams))
               foreach ($bindParams['value'] as $key => $value)
               {
                   
                    $stmt->bindParam($key, $value,2 );
                   // $stmt->bindParam($key, $bindParams['value'][$key],2 );
               }

$stmt->execute();
$res=$stmt->fetchAll();
print_r($res);


?>


Также прикладываю sqlник для создание тестовой базы mysql:

Код

/*
SQLyog Enterprise - MySQL GUI v8.1 Beta1
MySQL - 5.1.37 : Database - test
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

CREATE DATABASE /*!32312 IF NOT EXISTS*/`test` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `test`;

/*Table structure for table `test` */

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;





Это сообщение отредактировал(а) Veve - 30.11.2009, 18:29
PM MAIL ICQ Skype MSN   Вверх
Simpliest
Дата 30.11.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(Veve @  30.11.2009,  17:26 Найти цитируемый пост)
foreach ($bindParams['value'] as $key => $value)


Код

foreach ($bindParams['value'] as $key => &$value)


Вот тебе и весь секрет.

Добавлено через 1 минуту и 5 секунд
Заняло ровно 30с вместе с копированием скриптов smile


--------------------
user posted image
PM   Вверх
Veve
Дата 30.11.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 3
Всего: 13



Спасибо,
Нельзя ли в более раскрытой форме объяснить почему так. 
PM MAIL ICQ Skype MSN   Вверх
Simpliest
Дата 30.11.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: 1
Всего: 3



Цитата(Veve @  30.11.2009,  17:53 Найти цитируемый пост)
Нельзя ли в более раскрытой форме объяснить почему так.  

Ммм. исходники надо смотреть.

Собственно натолкнуло меня на эту мысль то, что при биндинге привязывается не конкретное значение, а переменная! (точнее ссылка на значение)

Поэтому в первом случае ты использовал ссылку разных элементов массива!
А во втором случае одной и той же переменной. В его конце оно затиралось последним значением и во все плейсхолдеры шло именно оно.
Т.е. запрос получался как бы
Код

SELECT * FROM   test WHERE  id=name1 and name=name1



--------------------
user posted image
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.