[Help] Varbinary datatype with PDO

Dea7h

Admiral General Aladeen
Joined
Jan 16, 2009
Messages
1,189
Reaction score
426
Здравейте!
Трябва ми малко помощ, опитвам се да взема информацията от MSSQL varbinary(1200) Data Type със PDO (става въпрос за Му (например кода за предметите в сандъка/инвентара)), но ми се струва, че не е толкова просто колкото аз си мисля... Не знам.
Със mssql_query е ясно:
PHP:
$query = mssql_query("declare @it varbinary(1200); set @it=(select [Items] from [warehouse] where [AccountID]='acc'); print @it");
и след това със mssql_get_last_message

Но със PDO изглежда е доста по-сложно, аз пробвах по всевъзможни начини, изчетох всички статии които намерих, но не ми се получи... Пробвах по следните начини отначало но не се получи:

PHP:
$query = $connect->prepare("DECLARE @it varbinary(1200)");
$query = $connect->prepare("SET @it = (SELECT Items FROM warehouse WHERE AccountID='dada')");
$query = $connect->prepare("print @it");
$query->execute();

това ми дава следната грешка:
Array ( [0] => 00000 [1] => 10007 [2] => Must declare the scalar variable "@it". [10007] (severity 5) [(null)] [3] => -1 [4] => 5 )

$my_query = $connect->prepare("DECLARE @it varbinary(1200); SET @it = (SELECT Items FROM warehouse WHERE AccountID='dada'); print @it");
Може би се прави със bindParam или не знам... Моля за помощ! (tmi)
 

hrisiz

Active Member
Joined
Feb 3, 2010
Messages
429
Reaction score
81
Пробвай с
$account = "dada";
$query = $db_conn->prepare("SELECT Items FROM warehouse WHERE AccountID = :acc");
$query ->execute(Array('acc'=>$account));
$values = $query->fetchAll();

Задал съм "dada" с променлива за да можеш лесно да промениш стойността.
За да достъпиш стойностите на select-а си принтираи с print_r($values) за да видиш как се запазват :) Иначе до колкото помня би трябвало да можеш да достъпиш стойността и с $values[0][0].
Ако ти трябва само 1 ред, както мисля че е в слъчая, използвай $query->fetch() - взима само първия ред.

P.S. Това горе го написах по спомен не съм го тествал, но ето нещо което със сигурност работи писъл съм го преди няколко години, затова е тотално грешно, но работи :)
$inventory = $db_conn->query("Select items from warehouse Where AccountId='$account'")->fetchAll();
$inventory = $inventory[0][0];
 
Last edited:
  • Like
Reactions: Dea7h

Dea7h

Admiral General Aladeen
Joined
Jan 16, 2009
Messages
1,189
Reaction score
426
Пробвай с
$account = "dada";
$query = $db_conn->prepare("SELECT Items FROM warehouse WHERE AccountID = :acc");
$query ->execute(Array('acc'=>$account));
$values = $query->fetchAll();

Задал съм "dada" с променлива за да можеш лесно да промениш стойността.
За да достъпиш стойностите на select-а си принтираи с print_r($values) за да видиш как се запазват :) Иначе до колкото помня би трябвало да можеш да достъпиш стойността и с $values[0][0].
Ако ти трябва само 1 ред, както мисля че е в слъчая, използвай $query->fetch() - взима само първия ред.

P.S. Това горе го написах по спомен не съм го тествал, но ето нещо което със сигурност работи писъл съм го преди няколко години, затова е тотално грешно, но работи :)
$inventory = $db_conn->query("Select items from warehouse Where AccountId='$account'")->fetchAll();
$inventory = $inventory[0][0];

И 2те работят благодаря много! Изкарват следното:
Code:
N<5ј˜Љ(жяяяяяяяяяяо<3c яяяяяяяяяяЋЬ`5»pдяяяяяяяяяяЛX3%Ђ7О2[ЂяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяЛX3"Ђа	О1міЂѕ<5ШFЉґЮяяяяяяяяяяЁA5Щ№ЊЁ‘©A5ФXЊяяяяяяяяяяяяяяяяяяяяЛX1ЯЂО1каЂяяяяяяяяяяяяяяя

Но изглежда трябва да се декодне по някакъв начин? Аххх...

ПС: Казаха ми, че не може да се вземе Varbinary data директно... :/
 
Last edited:

hrisiz

Active Member
Joined
Feb 3, 2010
Messages
429
Reaction score
81
И 2те работят благодаря много! Изкарват следното:
Code:
N<5ј˜Љ(жяяяяяяяяяяо<3c яяяяяяяяяяЋЬ`5»pдяяяяяяяяяяЛX3%Ђ7О2[ЂяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяЛX3"Ђа	О1міЂѕ<5ШFЉґЮяяяяяяяяяяЁA5Щ№ЊЁ‘©A5ФXЊяяяяяяяяяяяяяяяяяяяяЛX1ЯЂО1каЂяяяяяяяяяяяяяяя

Но изглежда трябва да се декодне по някакъв начин? Аххх...

ПС: Казаха ми, че не може да се вземе Varbinary data директно... :/

Пробвай да ги принтираш като шестнайсетичен код примерно с echo sprintf("%x",$values[0][0]);
Не помня много как стоеха нещата с декодването на HEX-a, но ако ползваш 97d+99i на DarkMaster според стария сайт, който ползвах ги деля на по 20 символа с str_split($inventory,20); това ще ти върне масив, който има елементи съдържащо стринг от 20 символа(HEX код), който вече съдържа информация за предмета.
 
Last edited:
  • Like
Reactions: Dea7h

Dea7h

Admiral General Aladeen
Joined
Jan 16, 2009
Messages
1,189
Reaction score
426
Пробвай да ги принтираш като шестнайсетичен код примерно с echo sprintf("%x",$values[0][0]);

Така излиза само 0. :death:

edit: Пробвах със bin2hex и после urlencode и стана... Мерси за помощта hrisiz ;)
 
Last edited: