Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Seguinte,
Eu tenho uma página de atualização de lista de faixas que estão agrupados por álbum, com os dados vindo através de parâmetros na url como o albumID e detalhes e são retornados dentro de um while.
O que eu queria é que ele atualizasse todos os campos que fossem editados se eles fossem modificados, mas o que o ocorre é que apenas o último registro é atualizado.
O script que traz as faixas:
<tr>
<form class="form-group" method="post" action="includes/funcoes/atualizar-faixas.php">
<?php while($sqlSelect = mysqli_fetch_assoc($result)) { ?>
<td><input type="text" value="<?php echo $sqlSelect['trackNumero'] ?>" class="form-control" name="trackNumero"></td>
<td><input type="text" value="<?php echo $sqlSelect['trackTitulo'] ?>" class="form-control" name="trackTitulo"></td>
<td><input type="text" value="<?php echo $sqlSelect['trackTraducao'] ?>" class="form-control" name="trackTraducao"></td>
<td><input type="text" value="<?php echo $sqlSelect['trackID'] ?>" class="form-control" name="trackID" readonly></td>
<td><input type="text" value="<?php echo $sqlSelect['albumID'] ?>" class="form-control" name="albumID" readonly></td>
</tr>
<?php } ?>
<tr><a href="albuns-lista.php"><button name="cancelar" id="cancelar" class="btn btn-danger mb-3 mr-1" type="button"> <i class="fa-solid fa-arrow-left"></i> Voltar</button></a></tr>
<tr><button name="update" id="update" class="btn btn-success mb-3" type="submit" value=""><i class="fa-solid fa-arrow-up-from-bracket"></i> Atualizar</button></tr>
</form>
E esse é o resultado do código acima:
[/applications/core/interface/imageproxy/imageproxy.php?img=https://forum.scriptbrasil.com.br/uploads/monthly_2023_03/resultado.jpg.ae97fdf5679682fd8137f43b4cf9d84f.jpg&key=d198cdad25bf50cb103c3374c02e7fa7ee47907720815cbc7e605d53837ba8c5" style="border-style:none;vertical-align:middle;" width="981" data-imageproxy-source="https://forum.scriptbrasil.com.br/uploads/monthly_2023_03/resultado.jpg.ae97fdf5679682fd8137f43b4cf9d84f.jpg" />](https://forum.scriptbrasil.com.br/uploads/monthly_2023_03/resultado.jpg.ae97fdf5679682fd8137f43b4cf9d84f.jpg)
E este é o código que uso pra fazer o **UPDATE** no banco de dados:
<?php
require_once "../db/albuns.php";
if(isset($_POST['update'])){
$trackNumero = $_POST['trackNumero'];
$trackTitulo = mysqli_real_escape_string($conecta2, $_POST['trackTitulo']);
$trackTraducao = $_POST['trackTraducao'];
$trackID = $_POST['trackID'];
$albumID = $_POST['albumID'];
$sqlUpdate = "UPDATE `faixas` SET `trackTitulo` = '$trackTitulo', `trackNumero` = '$trackNumero', `trackTraducao` = '$trackTraducao' WHERE `albumID` = $albumID AND `trackID` = $trackID";
if($atualizaDados = mysqli_query($conecta2, $sqlUpdate) == true){
var_dump($sqlUpdate);
//header("location: ../../albuns.php?update=sucesso");
} else {
//header("location: ../../albuns.php?update=erro");
}
}
?>
Como eu faria para que cada linha fosse atualizada individualmente? Já tentei diversos métodos, mas o resultado continua sendo a atualização apenas do último registro no banco, ignorando o restante das atualizações.Muito obrigado! Eu vou fazer algumas alterações no meu código para ver o resultado e dar um feedback.
Como é um projeto pra eu botar a prova alguns cursos que fiz, boa parte disso é feito localmente - não que segurança não seja uma preocupação.
Sobre as ponderações:
- Qual seria a melhor forma de fazer essa filtragem?
- Qual seria a melhor forma para escapar caracteres como aspas simples que geralmente aparecem em textos em inglês sem quebrar a query?
- Eu não sabia que o msyqli tinha suporte a querys preparadas, pensei fosse uma coisa do PDO apenas. Vou dar uma olhada nisso.
Sobre a sugestão:
Eu ainda estou me aprofundando em PDO, ainda pretendo converter meu projeto para PDO da facilidade.
As filtragens que pode aplicar é bem variável, pois depende se vai ou não manter ou permitir determinadas entradas.
-
Digamos que eu não queira uso de um caractere de aspa, então eu não executo o restante do código porque tem uma aspa na informação.
-
Mas se eu quero essa aspa eu posso alterar ela de forma que a mesma não chegue a atrapalhar ou quem sabe até dar algum problema.
-
Ou então não quero essa aspa ao invés parar a execução ou converter, simplesmente removo e meu código pode continuar.
Isso também remonta a vários outros caracteres também usados no nosso ou em outros idiomas.
O ruim de barrar caracteres atualmente são os conhecidos emoticon comuns em aparelhos móveis.
Então bloquear determinados caracteres deve-se assegurar que esses caracteres não vão comprometer a exibição desses emoticon que são compostos caracteres unicode.
Vou compor uma situação aqui:
<?php
class exemplo {
private static $string;
public static function converter($x) {
self::$string = (string) $x;
self::codificar();
self::aspas();
return (self::$string);
}
private static function codificar() {
self::$string = mb_convert_encoding(htmlentities(self::$string), 'UTF-8', 'ASCII');
}
private static function aspas() {
$aspas = ['/\'/', '/"/', '/`/'];
$entidades = [''', '"', '`'];
self::$string = preg_replace($aspas, $entidades, self::$string);
}
}
// É um texto com "aspas" > e com a mesma 'simples' e invertida também
$strA = "It'is a text with \"quotes\" > and with the same 'simple' and inverted `also`";
$strB = exemplo::converter($strA);
echo ($strB . "<br />");
echo ("<pre>");
var_dump($strB);
echo ("</pre>");
Se executar o código $strB mesmo sendo o valor aplicado pela classe é mostrado como o texto original não aparenta que nada foi modificado, até mesmo a função var_dump não monstra nada diferente.
Até mesmo se inspecionar o texto pelo navegador não se ver diferença.
Isso porque quaisquer caracteres especiais que venha a conter foram substituídos por entidades html então o navegador sempre irá mostrar ele como ele deveria ser exemplo:
Mostra **" **mas na verdade é **"**
Mostra **> **mas na verdade é** >**
A única forma que existe para que se consiga ver como realmente é o texto é executando ele com algo que não é um interpretador html, PHP é um interpretador html.
Podemos usar o javascript:
echo ("<script>console.log(\"{$strB}\")</script>");
Então no console do navegador verei como o texto é antes de ser interpretado.
Digamos que salvo algum texto no banco de dados, quaisquer eventuais códigos serão salvos no banco sim, mas não como códigos funcionais apenas como uma simples string que nunca será interpretada como função, ou seja nunca sendo executada. Mesmo repassando a mesma eu várias ocasiões.
A não ser que eu transforme novamente o texto de entidades a caracteres:
echo html_entity_decode(utf8_decode($strB)); // Retorna o código ao estado original
Você pode aplicar muito mais conversões usando entidades der uma olhada nisso que achei
https://oinam.github.io/entities/
Mas deixo claro que só a função htmlentities já faz um bom trabalho.
O ponto forte de se usar entidades é que nunca irá precisar se preocupar com erros de acentuação por causa de codificação da aplicação pois não importa o idioma se é árabe, chinês, inglês ou português, se é utf-8, ANSI ou sei lá, quaisquer problemas relacionados a isso estarão solucionados.
-
João é amigo de maria
-
João é amigo de maria
PDO e áspas....
PDO já salva aspas escapadas para evitar justamente a quebra da coluna no banco de dados.
Simples dados 1 é substituído por dados 2/ e 3 substitui 2/ 4 substitui 3 etc... etc... etc...
Exemplo:
var_dump($variavel); // Resultado é (string) CCC pois é a ultima informação igual definida.$variavel = [
'AAA',
'BBB',
'CCC'
];
var_dump($variavel); // Resultado é (array) AAA,BBB,CCC.
Na verdade a substituição já acontece quando o navegador vai enviar as informação, somente enviando a última que substitui todas anteriores.
Você pode definir os inputs como um array assim quando chegar ao lado do servidor terá vários dados dentro de uma array na super-global post
Exemplo:
-
Filtre melhor os dados que serão processados no servidor, imagine alguém quebrar a sintaxe do php para expor o código fonte que está sendo processado pelo servidor.
-
mysqli_real_escape_string é muito fácil burlar se é que isso funciona mesmo.
-
Nunca passe uma informação vinda do usuário direto dentro de uma query, nunca se sabe o que está sendo executado, injeções de código vem de todo lugar e você não vai querer alguma detonando todo seu baco de dados ou vai?
-
Use query pré preparadas https://www.php.net/manual/pt_BR/mysqli.quickstart.prepared-statements.php
Dica pessoal minha:
PDO é uma boa (não a melhor) alternativa pois já possui uma pequena proteção em seu mais simples uso. Não é bicho de sete cabeça e mais fácil e seguro de usar que mysqli.