
HUGO BORGES
Membros-
Total de itens
69 -
Registro em
-
Última visita
Tudo que HUGO BORGES postou
-
Funçao Para Validar CNPJ
pergunta respondeu ao Beraldo de HUGO BORGES em Repositório de Scripts - PHP
Beraldo, vlw graças e sua explicação mudei meu algoritmo e deu certo. Caso alguma pessoa queira usar segue abaixo: // Verifica se o CNPJ é verdadeiro function verificaCNPJ($cnpj) { if (strlen($cnpj) <> 14) return 0; $soma1 = ($cnpj[0] * 5) + ($cnpj[1] * 4) + ($cnpj[2] * 3) + ($cnpj[3] * 2) + ($cnpj[4] * 9) + ($cnpj[5] * 8) + ($cnpj[6] * 7) + ($cnpj[7] * 6) + ($cnpj[8] * 5) + ($cnpj[9] * 4) + ($cnpj[10] * 3) + ($cnpj[11] * 2); $resto = $soma1 % 11; $digito1 = $resto < 2 ? 0 : 11 - $resto; $soma2 = ($cnpj[0] * 6) + ($cnpj[1] * 5) + ($cnpj[2] * 4) + ($cnpj[3] * 3) + ($cnpj[4] * 2) + ($cnpj[5] * 9) + ($cnpj[6] * 8) + ($cnpj[7] * 7) + ($cnpj[8] * 6) + ($cnpj[9] * 5) + ($cnpj[10] * 4) + ($cnpj[11] * 3) + ($cnpj[12] * 2); $resto = $soma2 % 11; $digito2 = $resto < 2 ? 0 : 11 - $resto; return (($cnpj[12] == $digito1) && ($cnpj[13] == $digito2)); } if (!verificaCNPJ($cnpj)){ $erro = 1; echo "<script>alert('ERRO. CNPJ não é valido.'); history.back();</script>"; die; } // Fim Verifica se o CNPJ é verdadeiro -
Galera criei um scrip com ajuda de varias pessoas aqui do forum, o scrip e simples a variável $foto recebe o nome da foto em MD5 + a extensão dela. // Verifica se existir o arquivo (Foto) if(isset($_FILES["arquivo"])){ $arquivo = $_FILES["arquivo"]; $arrArquivo = explode('.',$arquivo['name']); // Tranforma em array o nome do arquivo $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); // Obtem a extensão do arquivo $arrExtPermitidas = array('JPG', 'GIF', 'PNG', ''); // Array com as extensões permitidas // Caso a extensão não for permitida if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){ echo "<script>alert('ERRO. Formato da imagem não e suportado.'); history.back();</script>"; exit(); } // Gera um identificador único para o arquivo $nomeDoArquivo = md5(uniqid(rand(), true)); // Diretorio dos arquivos $pasta_dir = "../Imagens/Imagens_BD/Avatar/"; // Definindo o destino do arquivo $arquivo_nome = $pasta_dir . $nomeDoArquivo . '.' . $fileExtencion; // Faz o upload da imagem move_uploaded_file($arquivo["tmp_name"], $arquivo_nome); $foto = $nomeDoArquivo . '.' . $fileExtencion; } Bom o que quero fazer e o seguinte, quando eu não enviar foto quero que a variável $foto receba (nada). Aguardo ajuda ----------------------------------------------------------- EDIT ----------------------------------------------------- Galera procurem em outros lugares na net e achei como corrigir, vou postar aqui caso seja útil para alguém. $foto = $_FILES["arquivo"]; // Verifica se existir o arquivo (Foto) if (!empty($foto["name"])) { $arquivo = $_FILES["arquivo"]; $arrArquivo = explode('.',$arquivo['name']); // Tranforma em array o nome do arquivo $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); // Obtem a extensão do arquivo // Verifica o tipo de conta se for funcionário e obrigatorio colocar foto if(($tipoconta == '1')){ $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); // Array com as extensões permitidas }else{ $arrExtPermitidas = array('JPG', 'GIF', 'PNG', ''); // Array com as extensões permitidas } // Caso a extensão não for permitida if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){ echo "<script>alert('ERRO. Formato da imagem não e suportado.'); history.back();</script>"; exit(); } // Gera um identificador único para o arquivo $nomeDoArquivo = md5(uniqid(rand(), true)); // Diretorio dos arquivos $pasta_dir = "../Imagens/Imagens_BD/Avatar/"; // Definindo o destino do arquivo $arquivo_nome = $pasta_dir . $nomeDoArquivo . '.' . $fileExtencion; // Faz o upload da imagem move_uploaded_file($arquivo["tmp_name"], $arquivo_nome); $foto = $nomeDoArquivo . '.' . $fileExtencion; }else{ $foto = ''; }
-
Bom o que eu queria era que eu informasse o CNPJ sem os (. , / ) e ele me falasse se ele era falso.
-
Funçao Para Validar CNPJ
pergunta respondeu ao Beraldo de HUGO BORGES em Repositório de Scripts - PHP
Bom na verdade não e isto, quero digitar um CNPJ sem os (. / )e quero que o codigo fala se ele e falso. -
Galera eu peguei um scrip na net que valida o CNPJ (verifica se ele e valido). // Verifica se o CPF é verdadeiro function verificaCNPJ($cnpj) { if (strlen($cnpj) <> 18) return 0; $soma1 = ($cnpj[0] * 5) + ($cnpj[1] * 4) + ($cnpj[3] * 3) + ($cnpj[4] * 2) + ($cnpj[5] * 9) + ($cnpj[7] * 8) + ($cnpj[8] * 7) + ($cnpj[9] * 6) + ($cnpj[11] * 5) + ($cnpj[12] * 4) + ($cnpj[13] * 3) + ($cnpj[14] * 2); $resto = $soma1 % 11; $digito1 = $resto < 2 ? 0 : 11 - $resto; $soma2 = ($cnpj[0] * 6) + ($cnpj[1] * 5) + ($cnpj[3] * 4) + ($cnpj[4] * 3) + ($cnpj[5] * 2) + ($cnpj[7] * 9) + ($cnpj[8] * 8) + ($cnpj[9] * 7) + ($cnpj[11] * 6) + ($cnpj[12] * 5) + ($cnpj[13] * 4) + ($cnpj[14] * 3) + ($cnpj[16] * 2); $resto = $soma2 % 11; $digito2 = $resto < 2 ? 0 : 11 - $resto; return (($cnpj[16] == $digito1) && ($cnpj[17] == $digito2)); } if (!verificaCNPJ($cnpj)){ $erro=1; echo "<script>alert('ERRO. CNPJ não é valido.'); history.back();</script>"; die; } // Fim Verifica se o CPF é verdadeiro Ele funciona 100%, porem eu tenho que colocar o CNPJ com os . pontos e - Queria colocar apenas os números, alguém sabe como posso fazer isto?
-
Vlw vou dar uma olhada :).
-
Galera fis um scrip de busca em PHP + MySQL que funciona assim: HTML <form name="formulario" method="post" action="index.php?pagina=Paginas/Shop.php&action=ver&hardware=$resultado->hardware"> <table align="center"> <tr> <td>Selecione o produto desejado:</td> <td> <select class="form_campos" name="hardware"> <option value="" selected>Seleciono o Hardware</option> <option value="">------------------------------------</option> <option value="Placa de Rede">Placa de Rede</option> <option value="Placa de Rede Wirelles">Placa de Rede Wirelles</option> <option value="Rede Wirelles USB">Rede Wirelles USB</option> <option value="">------------------------------------</option> <option value="Suprimentos">Suprimentos</option> </select><input class="form_botao" type="submit" name="OK" value="OK"> </td> </tr> </table> </form> PHP: // Ver todos os produtos --------------------------------- if(@$_REQUEST['action']=="ver"){ // Recebe dados do formulario $hardware = $_REQUEST['hardware']; // Verificar Formulario // if ($hardware == '') { echo "<script>alert('ERRO. Selecione o produto desejado.'); history.back();</script>"; die; } // Faz consulta no banco de dados $consulta = mysql_query("select * from produto where hardware = '$hardware'"); //Checa se a produtos na categoria if((mysql_num_rows($consulta) == 0)){ echo "<center>Infelizmente não a produtos disponiveis nesta categoria.</center>"; }else{ while($resultado = mysql_fetch_object($consulta)) { //Checa se a produtos na categoria if((($resultado->quantidade) == 0)){ }else{ //Checa se o produtos esta disponivel if($resultado->quantidade == 0){ }else{ echo "<table>"; echo "<tr>"; echo "<td align=center width =150><img src='Imagens/Imagens_BD/Shop/$resultado->foto' width=116 height=87</td>"; echo "<td align=center width =300><b>$resultado->modelo</b><br>Código: $resultado->codigo</td>"; //Checa se o produtos esta na promoção if($resultado->tipo == 0){ echo "<td align=center width =100><b>R$ ".number_format($resultado->preço, 2)."</b></td>"; }else{ echo "<td align=center width =100><b>R$ ".number_format($resultado->preço, 2)."</b><br><img src=Imagens/promoção.png></td>"; } echo "<td align=center width =150><b>$resultado->estado</b><br>Garantia $resultado->garantia</td>"; echo "<td align=center width =25><a href=index.php?pagina=Paginas/Shop.php&action=verproduto&codigo=$resultado->codigo&hardware=$resultado->hardware><b><i>Ver</b></i></a></td>"; echo "</tr>"; echo "</table>"; echo "<hr>"; } } } } } // FIM todos os produtos --------------------------------- Então ele funciona assim eu coleciono o tipo de produto que eu quero e ele lista o produto.Este scrip funciona 100%. Mas queria saber como faço para pode digitar memória e ele listar todos os produtos que tem o nome parecido com memoria. Vlw galera aguardo ajuda.
-
Bom funciona assim: NA coluna foto fica salvo o nome da foto,assim quando pesquisar pelos dados do ID (X) Vou ver a foto (X). Entendeu? Estava com algo em menta assim, quando eu clicar em deletar foto, algum comando vai ver o nome e extensão da foto e vai deletar ela, assim depois e so eu colocar uma foto novo, Entendeu? ------------------------------------------------------------- EDIT ------------------------------------------------ Bom tive aqui pesquisando e já achei uma solução, no arquivo edit eu coloco a seguinte linha: unlink('../Imagens/Imagens_BD/Equipe/' . $resultado->linkfoto); Ela deleta a foto antiga do BD e depois vem o comando: $arquivo = $_FILES["arquivo"]; $arrArquivo = explode('.',$arquivo['name']); // Tranforma em array o nome do arquivo $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); // Obtem a extensão do arquivo $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); // Array com as extensões permitidas // Caso a extensão não for permitida if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){ echo "<script>alert('ERRO. Formato da imagem não e suportado.'); history.back();</script>"; exit(); } // Gera um identificador único para o arquivo $nomeDoArquivo = md5(uniqid(rand(), true)); $pasta_dir = "../Imagens/Imagens_BD/Equipe/"; // Diretorio dos arquivos // Definindo o destino do arquivo $arquivo_nome = $pasta_dir . $nomeDoArquivo . '.' . $fileExtencion; // Faz o upload da imagem move_uploaded_file($arquivo["tmp_name"], $arquivo_nome); $foto = $nomeDoArquivo . '.' . $fileExtencion; Que re-coloca a nova foto. Bom isto esta funcionando perfeitamente, quando eu coloco uma foto nova ele deleta a antiga, ficando a nova foto, so tem um problema se eu não colocar foto nem uma ele deleta a foto antiga, deixando a tabela sem foto. Bom o que eu quero sabe e como fazer para que este código acima so rode se tiver uma imagem colecionada?
-
Bom Romero, deu certo sim, com isso o scrip ta quase pronto, ele esta assim: // Verifica se existir o arquivo (Foto) if(isset($_FILES["arquivo"])){ $arquivo = $_FILES["arquivo"]; $arrArquivo = explode('.',$arquivo['name']); // Tranforma em array o nome do arquivo $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); // Obtem a extensão do arquivo $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); // Array com as extensões permitidas // Caso a extensão não for permitida if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){ echo "<script>alert('ERRO. Formato da imagem não e suportado.'); history.back();</script>"; exit(); } // Gera um identificador único para o arquivo $nomeDoArquivo = md5(uniqid(rand(), true)); $pasta_dir = "../Imagens/Imagens_BD/Equipe/"; // Diretorio dos arquivos // Definindo o destino do arquivo $arquivo_nome = $pasta_dir . $nomeDoArquivo . '.' . $fileExtencion; // Faz o upload da imagem move_uploaded_file($arquivo["tmp_name"], $arquivo_nome); $foto = $nomeDoArquivo . '.' . $fileExtencion; } Muito obrigado por tar me esplicando tudo :). Mas se não simportar vo fazer mais 2 perguntas para finalizar; 1° Com isto nem uma imagem não vai ser perdida não é?, tipo o scrip sempre vai gerar um nome que não existe por outra imagem? 2° Bom esta e mais complicada, você notou que o BD foi feito assim: CREATE TABLE `imagens` ( `id` real NOT NULL auto_increment, `foto` varchar(25) NOT NULL, PRIMARY KEY (`id`) ); Suponha que quero trocar a foto da ID 6, como posso fazer para que a foto antiga seja apagada e seja inserida a foto nova? Assim não ira ficar fotos em desuso no servidor. Vlw aguardo seu contato :).
-
Romero Dias, bom agora deu certo vlw. Mas voltando a minha pergunta 2, poderia me explicar esta função porque não entendi muito bem. $arquivo_nome = $pasta_dir . 'arquivo_nomeado_pelo_sistema.' . $fileExtencion; No meu scrip a variável que recebe o nome da foto e grava ela no BD e a $foto, como no exemplo abaixo: // Faz o upload da imagem move_uploaded_file($arquivo["tmp_name"], $arquivo_nome); $foto = $arquivo["name"]; O motivo que fiz assim foi que preciso gravar apenas o nome da imagem e não o caminho todo. O problema que que nunca pode aver substituição, tipo a imagem tem que ser renomeada por um nome que não exista ainda, assim não perco nem uma imagem.
-
Romero Dias,bom eu tentei colocar mais este scrio seu, ele ficou assim: // Verifica se existir o arquivo (Foto) if(isset($_FILES["arquivo"])){ $arquivo = $_FILES["arquivo"]; $arrArquivo = explode('.',$arquivo); // tranforma em array o nome do arquivo $fileExtencion = trim($arrArquivo [count($arrArquivo )-1]); //obtem a extensão do arquivo $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); //array com as extensões permitidas //caso a extensão não for permitida if(!in_array(strtoupper($fileExtencion),$arrExtPermitidas)){ echo "arquivo não autorizado"; exit(); } $pasta_dir = "../Imagens/Imagens_BD/Equipe/"; // Diretorio dos arquivos $arquivo_nome = $pasta_dir . $arquivo["name"]; // Faz o upload da imagem move_uploaded_file($arquivo["tmp_name"], $arquivo_nome); $foto = $arquivo["name"]; } Porem ocorreu o seguinte erro: Warning: explode() expects parameter 2 to be string, array given in /opt/lampp/htdocs/www/HDR Info/adm/Equipe.php on line 45 arquivo não autorizado Na linha 45 não tem nada, e a linha 44 é esta aqui: $arrExtPermitidas = array('JPG', 'GIF', 'PNG'); //array com as extensões permitidas O estranho e que a imagem que estou tentando enviar e JPG. ------------------------------------------------------------------------------------------------------------ david.lyonnais, VLW. Eu retirei as ", mas não entendi o porque elas poderiam ser um possível erro, poderia me explicar?
-
Bom galera montei um scrip de upload em PHP + MySQL, com vários tutorias pela net. Segue a estrutura dele: DB do MySQL: CREATE TABLE `imagens` ( `id` real NOT NULL auto_increment, `foto` varchar(25) NOT NULL, PRIMARY KEY (`id`) ); Config: <?php // Conexão com o banco de dados MySQL $db="teste"; $Server_site="localhost"; $Login_admin="root"; $Senha_admin=""; // Conecta paginas a DB $conexao = mysql_connect("$Server_site", "$Login_admin", "$Senha_admin") or die ("O servidor não responde!"); $banco = mysql_select_db("$db") or die ("Não foi possivel conectar-se ao banco de dados!"); ?> Index.php: <html> <head> <title>Upload</title> </head> <body bgcolor = "#FFFFFF" text = "#000000"> <form name = "form1" method = "post" action = "upload.php" enctype = "multipart/form-data"> <input type = "file" name = "arquivo"> <input type = "submit" name = "Submit" value = "Enviar"> </form> </body> </html> upload.php: <?php include "Config.php"; // Se existir o arquivo if(isset($_FILES["arquivo"])){ $arquivo = $_FILES["arquivo"]; $pasta_dir = "";//diretorio dos arquivos $arquivo_nome = $pasta_dir . $arquivo["name"]; // Faz o upload da imagem move_uploaded_file($arquivo["tmp_name"], $arquivo_nome); // Envia os dados ao banco de dados $inserir = mysql_query ("INSERT INTO imagens VALUES ('','$arquivo_nome')"); // Verifica se foi enviados os dados if ($inserir == 1) { echo "<script>alert('Foto ADD com sucesso.'); history.back();</script>"; die; } } ?> Bom ai esta a estrutura dele, o que eu quero saber e como fazer para que possa ser enviado apenas imagens JPG, GIF, PNG. E também quero saber como fazer para que ele renomeia a imagem para um nome qualquer. Vlw galera aguardo contato
-
Com funciona SQL Injection e como se prevenir?
pergunta respondeu ao HUGO BORGES de HUGO BORGES em PHP
Vlw vou dar uma olhada. -
Com funciona SQL Injection e como se prevenir?
pergunta respondeu ao HUGO BORGES de HUGO BORGES em PHP
Como assim? -
Com funciona SQL Injection e como se prevenir?
pergunta respondeu ao HUGO BORGES de HUGO BORGES em PHP
Bom coloquei as ' e o erro apareceu: ERRO. SQL Inject detectado Então já esta funcionando, obrigado david.lyonnais pela atenção, fica com Deus. -
Com funciona SQL Injection e como se prevenir?
pergunta respondeu ao HUGO BORGES de HUGO BORGES em PHP
beleza meu arquivo inject.php ficou assim: <?php // Metodo anti-injection function anti_sql_inject($sql) { // Remove palavras que contenham sintaxe sql $sql = preg_replace("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/","",$sql); $sql = trim($sql); //limpa espaços vazio $sql = strip_tags($sql); //tira tags html e php $sql = addslashes($sql); //Adiciona barras invertidas a uma string return $sql; } ?> Agora posso ficar tranquilo contra inject? So mais uma coisa, acho que ficaria legal colocar uma mensagem para quem tentar usar inject, tipo assim: echo "<script>alert('ERRO. SQL Inject detectado.'); history.back();</script>"; Mas em que logar devo colocar isto? --------------------------- edit ------------------------------ E como posso testar para ver se o site esta protegido contra Inject? -
Com funciona SQL Injection e como se prevenir?
pergunta respondeu ao HUGO BORGES de HUGO BORGES em PHP
Vlw pela ajuda, criei um arquivo Inject.php, e para chamar a função faço assim: include "Inject.php"; $id = anti_injection($_GET['id']); $usuario = anti_injection($_POST['usuario']); Desse geito funciona? Tenho que colocar no $_REQUEST também? ------------------------------ EDIT --------------------------------- Notei um erro aqui: Deprecated: Function sql_regcase() is deprecated in /opt/lampp/htdocs/www/HDR Info/Inject.php on line 6 Já coloquei isto no meu sistema de login, quando digito o login e senha correto ele entra normal, mas quando digito errado, ele fala login e senha errado e aparece um erro na linha 6 onde esta esta parte: $sql = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|#|\*|--|\\\\)/"),"",$sql); O que sera que pode ser? -
Com funciona SQL Injection e como se prevenir?
pergunta respondeu ao HUGO BORGES de HUGO BORGES em PHP
david.lyonnais pelo que entendi onde tiver assim: $login = $_POST['login']; Tenho que colocar assim : $login = anti_injection($_POST['login']); E isto ira prevenir o SQL Injection? OBS: Tenho que colocar anti_injection($_POST em todos os POST? ----------------------------------------------------- EDIT --------------------------------- Olha achei este aqui na internet: <?php function anti_sql_injection($string) { $string = get_magic_quotes_gpc() ? stripslashes($string) : $string; $string = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($string) : mysql_escape_string($string); return $string; } ?> anti_sql_injection($_POST[’usename’]) Queria saber se este aqui funciona? -
Bom um colega meu falou que meu site pode estar vulnerável a SQL Injection, Poderiam me explicar como isto funciona e como posso me prevenir?
-
Jefferson Olivei... Este codigo seu para link e o mesmo do meu, e o seu não funcionou aqui não. E como funciona esta proteção sua?Não entendi. Um amigo meu me falo que meu site poderia ficar vulnerável a SQL Injection.Bom mas isto e assunto para outro tópico.
-
SK15: Este segundo método que você fez deu certo, mas poderia me explicar a lógica para que eu possa entender e apresentar meu trabalho. beuleal: Eu tentei desta forma sua também deu arro aki. david.lyonnais: Este código ai não e poluição, ele e um scrip em java que esconde o link, mantende o segurança do site. Explicação: <a href="http://Nome que aparece na barra inferior do navegador" onClick="window.open('Pagina que vai ser chamada','frame que sera chamada'); return false;"><b>Aqui você coloca onde e para clicar (clique aqui)</b></a>
-
Então eu coloquei isto ai, ate funcionou ela chama a pagina inicio. SO que tem este problema olha o erro que da: Notice: Undefined index: pagina in /opt/lampp/htdocs/www/HDR Info/index.php on line 18 Isto acontece porque a variável pagina não tem valor. Você tem uma idéia de como arrumar isto?
-
Oi galera, criei uma pagina em php que carrega as outras paginas dentro da mesmo, através de variáveis. Funciona assim: Index: // Verifica pagina a ser aberta $pagina = $_REQUEST['pagina']; // Aqui e onde a pagina e aberta <div id="page"> <?include "$pagina"; ?> </div> Agora todo o link que tem na pagina index e assim: <a href="http://Equipe" onClick="window.open('index.php?pagina=Paginas/Equipe.php','_top'); return false;"><b>Equipe</b></a> Explicação: Então concluirmos que toda vez que a pessoa clica no link a pagina index e carregada novamente, porem no meio dela abre a pagina chamada certo? Isto esta funcionando perfeitamente, o problema e quando eu abro a index pela primeira vez da este erro: Warning: include() [function.include]: Filename cannot be empty in /home/hugodrpc/public_html/novo/index.php on line 53 Warning: include() [function.include]: Filename cannot be empty in /home/hugodrpc/public_html/novo/index.php on line 53 Warning: include() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/hugodrpc/public_html/novo/index.php on line 53 Este erro ocorre porque a a variável $pagina = $_REQUEST['pagina']; não recebe nem um valor, o erro so sai quando clico em um link. Queria saber como eu faço para que quando carregar a index a variável $pagina = $_REQUEST['pagina']; receba o calor (inicio.php) e logo apos eu clicar em um link ela receba o valor do link. Vlw galera aguardo ajuda, fiquem com Deus.
-
A ta kkkk. Agora deu certo. Muito obrigado, fica com deus.
-
Olá eu tentei colocar = au seu e não deu certo não olha so: codigo: // Envia Formulario para email do ADM global $email; while ($resultado = mysql_fetch_object($consulta)) { $enviou = mail($resultado->email, "", "", ""); } "$assunto_mensagem", " Nome: $nome Contato: $contato E-mail: $email Assunto: $assunto_mensagem Mensagem: $mensagem", "From: $email <$nome>"); ERRO: Parse error: syntax error, unexpected ',' in /opt/lampp/htdocs/www/HDR Info/Paginas/Contato.php on line 22