1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[PHP/Mysql]

Discussão em 'Web Development' iniciada por undercore, 13 de Dezembro de 2008. (Respostas: 8; Visualizações: 1140)

  1. undercore

    undercore Power Member

    Boas pessoal.
    Estou a tentar inserir numa tabela mysql ficheiros, mas ao inserir da-me um erro
    alguem sabe porque?
    em baixo segue a tabela, e o dados.php.
    Obrigado.

    Código:
    CREATE TABLE arquivos (
    nome varchar(30) NOT NULL,
    tipo varchar(30) NOT NULL,
    tamanho varchar(30) NOT NULL,
    dados longblob NOT NULL,
    PRIMARY KEY (nome)
    );
    
    PHP:
    <?php
    include 'config.inc'
    $conteudo=addslashes(fread(fopen($arq"r"), filesize($arq))); 
     
    //Armazena no banco de dados
    $con=mysql_connect ($srv$usr$snh) or print mysql_error();
    $db=mysql_select_db ($banco$con) or print mysql_error();
    $sql="insert into arquivos (nome, tipo, tamanho, dados) values ('$arq_name', '$arq_type', '$arq_size', '$conteudo')";
    $exec=mysql_query ($sql$con) or print mysql_error();
    mysql_close ($con);
    header ("Location: $url/main.php"); /* direciona para o formulário */
    ?>
     
    Última edição pelo moderador: 13 de Dezembro de 2008
  2. Pernas

    Pernas Power Member

    O erro é que o teu $arq não é um "recurso" válido. Tens a certeza que está correcto?
     
  3. undercore

    undercore Power Member

    tenho a certeza de que? porque não é um recurso valido?
     
  4. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Faz
    PHP:
    die("\$arq: $arq");
    depois do include, para teres a certeza em como essa variável é um nome de ficheiro válido. O erro indica que não.

    Já agora, permite-me que comente o código em si:
    1)
    PHP:
    $conteudo=addslashes(fread(fopen($arq"r"), filesize($arq))); 
    Isto é evitável. Se a tua versão do PHP permitir, podes fazer
    PHP:
    $conteudo mysql_real_escape_string(file_get_contents($arq)); // não é usado o addslashes pelo que disse abaixo
    E mesmo que não permita, a tua linha tem dois senãos: não estás a fazer o fclose() ao ficheiro, e devias trocar o addslashes() pelo mysql_real_escape_string. Só terias de mudar uma coisa no teu código: a linha que chama esta função deve estar depois do mysql_connect.

    Em relação ao fclose(), é preferível usares uma variável para servir de handle, e fechas o ficheiro depois. Algo do género
    PHP:
    $ficheiro fopen($arq"r"); 
    $conteudo mysql_real_escape_string(fread($ficheirofilesize($arq))); 
    fclose($conteudo); 
    unset(
    $ficheiro); // facultativo
    2) Isto é o problema mais importante do teu código: CONFIG.INC? Isso é mesmo muito perigoso, porque um ficheiro .inc pode não ser interpretado pelo PHP e vai em plain text para alguém que o peça. Experimenta abrir a janela do browser, e em vez de escreveres index.php ou algo do género, escreve config.inc, e vê se o conteúdo do ficheiro é interpretado, porque se não for, ficas com um buraco de segurança demasiado grave.
     
  5. undercore

    undercore Power Member

    Desde ja agradeço a (boa) ajuda.
    Alterei o codigo, e pus como aconselhaste, mas ainda n deu.
    Os erros que dao sao:
    Warning: fread(): supplied argument is not a valid stream resource in /*/dados.php on line 9

    Warning: fclose(): supplied argument is not a valid stream resource in /*/dados.php on line 10


    PHP:
    <?php
    include 'config.inc';
    die(
    "\$arq: $arq");
     
    $con=mysql_connect ($srv$usr$snh) or print mysql_error();
    $db=mysql_select_db ($banco$con) or print mysql_error();
     
    $ficheiro fopen($arq"r");
    $conteudo mysql_real_escape_string(fread($ficheirofilesize($arq))); 
    fclose($conteudo);
    unset(
    $ficheiro);
     
    $sql="insert into arquivos (nome, tipo, tamanho, dados) values ('$arq_name', '$arq_type', '$arq_size', '$conteudo')";
    $exec=mysql_query ($sql$con) or print mysql_error();
    mysql_close ($con);
    header ("Location: $url/main.php"); /* direciona para o formulário */
    ?>
     
    Última edição pelo moderador: 13 de Dezembro de 2008
  6. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Não percebo como é que ele dá esse erro se puseste um die() antes. De certeza que já enviaste o ficheiro para o servidor?
     
  7. undercore

    undercore Power Member

    o form que eu tenho antes de ir para o data.php é:

    Código:
     
    <html><head>
    <title>Main</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
    <body bgcolor="#FFFFFF">
    <p> </p>
    <form method="post" action="dados.php" enctype="multipart/form-data">
    <table width="100%" border="0">
    <tr> 
    <td> </td>
    </tr>
    <tr>
    <td> 
    <table width="100%" border="0">
    <tr>
    <td width="20%"><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Localizar 
    arquivo:</b></font></td>
    <td width="80%">
    <input type="file" name="arq">
    </td>
    </tr>
    <tr>
    <td width="20%"> </td>
    <td width="80%">
    <input type="submit" name="Submit" value="Enviar">
    </td>
    </tr>
    </table>
    </td>
    </tr>
    <tr>
    <td> </td>
    </tr>
    </table>
    </form>
    <p> </p>
    </body></html>
    

    e eu selecciono um ficheiro .zip por exemplo.

    A ideia com que fico é q no data.php a variavel $arq nao tem nda, mas é estranho se eu no form anterior selecciono um ficheiro.
    Porque será?
     
    Última edição pelo moderador: 14 de Dezembro de 2008
  8. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Habitua-te a usar as tags [php]...[/php] e [code]...[/code], à volta do código, sff ;)

    Em relação ao tópico, vejo que tens vários problemas:
    1) Só quando tens o register_globals activado é que o campo arq passa a ser $arq. Agora, isso iria por $_POST.
    2) No entanto, como o teu form está a usar o tipo multipart/form-data, está a ir para o $_FILES["arq"].

    Portanto, depois do include, mete
    PHP:
    $arq $_FILES["arq"]["name"]
    3) Não é assim que se faz upload. O servidor não tem acesso aos ficheiros do cliente. O cliente é que envia UM ficheiro, por ele definido quando o escolhe, ao servidor, e isso não usa fopens, freads ou fcloses. Usa a superglobal $_FILES e o move_uploaded_file.

    Dá uma vista de olhos a isto: http://www.w3schools.com/PHP/php_file_upload.asp. Acho que esclarece estes pontos todos :)
     
  9. undercore

    undercore Power Member

    brigadao pela ajuda, bastante esclarecedor.

    topico fechado.
     

Partilhar esta Página