[Resolvido] Erro ao copiar registro que contém uma imagem (longblob)

Olá Pessoal.

Estou com o seguinte problema:

Tenho uma tabela de Pedidos, outra de Itens do Pedido e outra de Imagens dos itens do Pedido, acontece que no formulário de Pedidos que é um mestre-detalhe eu tenho uma operação disparada através de um botão que gera um cópia do meu Pedido, nesse momento o programa tem que ler todos os dados do Pedido em questão e inserir nas tabelas novos registros contendo os mesmo dados do Pedido, porém com um novo número de Pedido, até aí tudo perfeito, o novo pedido é gerado corretamente com os seus itens que foram copiados do pedido origem de forma bem simples. Leio os itens do pedido anterior e vou inserindo cada um na tabela de itens do pedido mudando apenas o número do pedido, beleza funciona direitinho, porém quando tento fazer a mesma operação para a tabela de imagens de itens do pedido dá um erro SQL ao tentar inserir o novo registro que contém uma imagem registrada (campo LONGBLOB), me parece que o programa não consegue inserir uma imagem diretamente pelo insert. Não tenho muita experiência com campos LONGBLOB e posso estar fazendo algo errado.

Alguém pode me ajudar com isso?

Muito obrigado e grande abraço a todos.

Algum dos experts pode me dar alguma luz a respeito desse problema?

Obrigado…

Podemos ajudar.
Mas qual o erro de SQL?

Olá Alexandre.

Dá o erro no SQL abaixo:

INSERT INTO pedtb001_1 (idemp, idped, idver, nrite, nrimg, image) VALUES (‘HB00’, ‘000000008’, ‘B’, ‘001’, ‘01’, 'ÿØÿàJFIF…, false)

A linha acima eu peguei no debug, mas veja que para o campo IMAGE ele joga uma string contendo a susposta imagem que foi lida do registro origem. Na verdade essa string é bem longa e acima está apenas o início dela, por certo é aí onde está o erro, porém eu não sei como resolver, pois como disse anteriormente, não tenho experiência com campos LONGBLOB e por certo estou fazendo algo errado.

Esse INSERT é resultado do código abaixo:

while(!$sel1->EOF)
{ $insert_fields = array(“idemp” => “’” . $sel1->fields[0] . “’” ,
“idped” => “’” . $sel1->fields[1] . “’” ,
“idver” => “’” . $idver . “’” ,
“nrite” => “’” . $sel1->fields[3] . “’” ,
“nrimg” => “’” . $sel1->fields[4] . “’” ,
“image” => “’” . $sel1->fields[5] . “’”);
$insert_sql = ‘INSERT INTO ’ . $insert_table . ’ (’ .
implode(’, ‘, array_keys($insert_fields)) . ‘)’ .
’ VALUES (’ .
implode(’, ', array_values($insert_fields)) . ‘)’ ;

  sc_exec_sql($insert_sql);

  $sel1->MoveNext();

}

$sel1 é resultado do select da própria tabela pedtb001_1 onde estou tentando fazer o INSERT, o que muda é apenas a chave que passar a ter um novo valor, mas o camo IMAGE que recebe $sel1->fields[5] vem da mesma tabela.

Obrigado pela atenção…

Apenas complementando… O erro que ocorre é o seguinte:

1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ at line 1

Na verdade a imagem realmente é uma string longa.
E será guardada assim no banco de dados.
Agora que já sabermos o erro:
1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘’ at line 1
Temos que achar onde as aspas estão no lugar errado e comprometendo a sintaxe.
Terei que sair agora.
Mas no final da tarde dou uma olhada com mais cuidado no insert que mandou.
Minha sugestão inicial e comentar esta parte:
sc_exec_sql($insert_sql);

  $sel1->MoveNext();

e fazer um echo $insert_sql; para ver como fica o SQL.
Se puder copie um dos $insert_sql que o comando echo revelou aqui.

Olá Alexandre, tentei te enviar o INSERT gerado, porém aqui no blog não é possível, pois a mensagem ultrapassar o 100000 caracteres permitidos, mas eu vi que o comando não foi fechado corretamente, me parece que a string ref.à imagem está ultrapassando a capacidade do editor para a montagem correta do comando. Eu cortei grande parte da string, deixando apenas o início e o final para conseguir te enviar e te mostrar como ficou, Veja abaixo: Onde está … … é onde eu tirei grande parte da string, apenas para poder te enviar.

INSERT INTO pedtb001_1 (idemp, idped, idver, nrite, nrimg, image) VALUES (‘HB00’, ‘000000008’, ‘B’, ‘001’, ‘01’, 'ÿØÿàJFIFHHÿá¶ExifMMž ¦°e¸(1.À2î‡i êa’êSAMSUNGGT-I5500BHHMicrosoft Windows Photo Viewer 6.1.7600.163852014:07:21 14:55:25‚š‚ˆ"ˆ’2a02202 2R‘a’a’ „ a0100 ° @ Œ¤¤¤¤ ¤ êa ê’‡22014:07:19 08:37:372014:07:19 08:37:37dR98a0100ÿá1¸http://ns.adobe.com/xap/1.0/ Microsoft Windows Photo Viewer 6.1.7600.16385 ÿÛCÿÛCÿÀ@°"ÿÄa ÿĵ}!1AQaa"q2‘¡#B±ÁRÑð$3br‚ %&’()456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄa ÿĵaw!1AQaaq"2B‘¡±Á #3RðbrÑ $4á%ñ&’()56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ?ù´Y}¾êî¡yäñúUÛk•~fY Áe^èIéïWccMƒqfä±þ•8µtŒG+1#æÊö’ü+ýV=Oóö­.Yhb#9$°Î[³N†Ø¹òQ7£pÒ•în|•·/G¦#N&@£eˆP½øöõ¬æ¹c©•>iO”†âØÂ¡Fã´ãkw¦Û¼ðn(&pcùa;_ƒÓ±­äÎ$-q$N¤3¾™÷§-Fí®88R{“]tÛq<ùÒIjS6¾TBG•rà GÛëPF¡xÉÉçqì Z™ƒ¶ÇÜ ÂÇŽÆœbi3VÐ>‚¬Çû´Ñ˜¬Ë+’¤qÞ¬JȲaÊ£#û«Mû$¼†ÿVÃæö§–†8ã½jæeE¸>wÜ—w—i4$Iݽ™3ŒT 1EFr’‹ÿ®? ·åçh9ÞžÖ¢2Yr›ëëWÍwÊtµ•.ˆ¬­VgxüÍ¡Fæ,z±¨¤ˆE!@Œ>c’{UÅB¢O,|ä‚eÔŠ•Ϙ¹r|Á€e×oô4à’Î¹Ò¾ïtRHƒn¨âaz„AûÍÀýã•SØ:ÓXLâêOðÐÿpò¬œ8¨m§fpµÉwЯsبX$éUÍ­thžéeêž[awïއŠ"G™˜|ÁÖ@›O÷Oô¯%‰´_4· ŒjÖRåHU$±S‹] ª¥w|¹î2|Źç¶jr¦tŒïÌ›¶du)Î ºñJÊÁØÊrßóÌÓ²¶Nx⤟A¸Xò †È)¼¿J¥:ÊgGˆª†h÷E\f®[BñB#w2FóïR¤eÉ%¾E#æõ4Õâ¬ÉÄ%4ª"#Œœ°Êª;ƒU<˜£`‰˜,‡?™ãšÐm¦@rŸtžÆˆâfvXÛzÒNîÌÂ4ù§Ï‘p<‘€ñõ5$6N‘#e—ž8^ŸäU½žZ±m¤`¿SïöË}¬]âåOfÌŸ-‡óY ’0¿ÄO­XxƒívrNTŽÆ´–ÈM@]ѶeÔçÚ£xpG;x’ÐÕŶ®:4¯î™»Þg¥d<ä“ìOô«ÑÉJ² f’äÜAÛÓ­\…bTÎÎÈÁ‡ÓƍáW‘¾ó’£ø¿úõq—ºÅGZRõ+Hþqýè]цÂùõïVöÚ›x™a+&Ü”LòÿÒ¢XÕŸqFYÙìMNÉ2|ѸLÆ9éUNNQ±œ§SsF|¾|ŠWtÖë¹X¦q•©mac e²[h


ñ½œAmš&³øƒ¨€v½Ä9bUq‰L‡“•Âÿ9ø£ã‡ñ.2Èñ˜vëaœŸÛ5ÍG­äô?iðïÁ¸pÝzyŽ ­¡S–êÝô–§ß~x÷â5¾¡ã¿üC›Á³xÃÃÖ6·V‘3K}g¾o”͍‘.Xݺ3‚@À>ãñ$üEðΉtÚ3ZjúÒc·V†7y4Y-"@òIžL
•3»±ŠõÖ´’HlbÔ´ý6þâKs™Œ“pª6þá ƒÀȬ;1Á[üQÔ¼oâ]Oá­Å®—â&}Q®mCÛjÚKŽ2³nfb¸8d×üÑx•ã‡x·â…>6â¼2ž RÔð÷i
©ÍÈå®®6‹’ítëÊX.eõ:ìU—¡øÃáOŽ¿¼Oñ/Äzíá&j>'øÅZJy2=Μûc- ivy±á£ýñÎqŽE}?ã?Åmo§|×™_PÖY¥ð^©u²8-…ÙÌ‚ëäwá1”lÌ|¼ÇÐ_µ>“ðÓTø]ãÝ[EŠÖ/hÞšöÁ-!Xâ^Ð1%½×’Ñ"‰„›ŽñÏ“¶¾Aøeû^üø•ðãGƒÆº6³âSEÓF¢·‰7ú^Ÿ~ØY¼Â½ÕXlO›°ÀÏþüxãVWâ_ƒlÏ’¤èÒ¦¹=Ÿ73¦Õ—/6—¶Çóßðõ,7}zŠø·õ±cÀÿôÿü)🂿±dOˆžøãK»o3‹™—ZbTaØXŠ7ß„ØWRp~QøÛñûãÂOÛ|6øóð¿_ºð¾°Öº¯€à®1ñÄxâsqu>o}é:väø]þµeñ?Cô<c†Âep¡ ezùžñð¿âÿÅ|r}Káwˆ¼7®Øø‡NoívÎÉ–{häý̶fÙq’#m žJcwàù÷í•¡øoÆ÷? îî

Veja que no final não está fechando com '); embora isso esteja no comando original, no programa.

Obrigado mais uma vez.

A imagem tem que ser guardada como base64, igual quando o Outlook guarda uma imagem no próprio HMTL não é a
imagem em si, mas ela convertida em base64 ‘Binário puro codificado em TEXTO’ nos bancos de dados é a mesma coisa.

while(!$sel1->EOF) {
$insert_fields = array(“idemp” => “’” . $sel1->fields[0] . “’” ,
“idped” => “’” . $sel1->fields[1] . “’” ,
“idver” => “’” . $idver . “’” ,
“nrite” => “’” . $sel1->fields[3] . “’” ,
“nrimg” => “’” . $sel1->fields[4] . “’” ,
“image” => “’” . base64_encode($sel1->fields[5]) . “’”);

  $insert_sql    = 'INSERT INTO ' . $insert_table . ' ('                . 
                     implode(', ', array_keys($insert_fields))   . ')' . 
                  '  VALUES ('                                         . 
                     implode(', ', array_values($insert_fields)) . ')' ;

  sc_exec_sql($insert_sql);

  $sel1->MoveNext();

}

while(!$sel1->EOF) {
     $insert_fields = array("idemp" => "'" . $sel1->fields[0] . "'" ,
                   "idped" => "'" . $sel1->fields[1] . "'" ,
                                       "idver" => "'" . $idver           . "'" ,
                             "nrite" => "'" . $sel1->fields[3] . "'" ,
                             "nrimg" => "'" . $sel1->fields[4] . "'" ,
                   "image" => "'" . base64_encode($sel1->fields[5]) . "'");

      $insert_sql    = 'INSERT INTO ' . $insert_table . ' ('                . 
                         implode(', ', array_keys($insert_fields))   . ')' . 
                      '  VALUES ('                                         . 
                         implode(', ', array_values($insert_fields)) . ')' ;

      sc_exec_sql($insert_sql);
   
      $sel1->MoveNext();
}

Base64:
https://pt.wikipedia.org/wiki/Base64

Acredito que o problema esteja nos caracteres especiais

Altere o trecho da sua query para

“image” => “’” .mysql_real_escape_string($sel1->fields[5]). “’”);

Maravilha Rodrigo… Você matou a charada, era isso mesmo. Resolvido.

Muito obrigado.

Ótimo, obrigado pelo retorno.

E no ScriptCase em uma consulta GRID nestes campos imagem, esta conseguindo exibir estas imagens? ou só faz download delas? já testou?

Olá Jailton.

Eu ainda não tive a necessidade de exibir as imagens em uma consulta GRID, eu sempre exibo em um PDFREPORT e aí funciona corretamente.

Cheguei agora.
Muito bom ter encontrado a solução.
Parabéns a todos.