logo
23.03.2020 09:33
1
Čaute, najde se borec přes mysql?

Na serveru mám nastaveno php 7.
Potřeboval bych nechat provádět zápis do tabulky mysql přes příkazový řádek prohlížeče.

Tabulka v mysql má tři sloupce id, name a score.
Aktuálně se mi podařilo dostat do stavu kdy se mi řádek v tabulce mysql vytvoří, id se zapíše jak má, ale "name" je prázdné a "score" je zapsaná hodnota 0.

Moc díky za případnou pomoc.

Příklad:

Příkazový řádek:
https://xxx.cz/xxx.php?name="Boby"&score="1000"

PHP:

// Create connection
$conn = new mysqli($mysql_hostname, $mysql_username, $mysql_password, $db_name);

// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}


if (isset($_GET["name"]) && isset($_GET["score"])){

//Lightly sanitize the GET's to prevent SQL injections and possible XSS attacks
$name = strip_tags(mysqli_real_escape_string($_GET["name"]));
$score = strip_tags(mysqli_real_escape_string($_GET["score"]));

$sql = mysqli_query($conn, "INSERT INTO `$db_name`.`$tbl_name` (`id`,`name`,`score`) VALUES ('','$name','$score');");
if($sql){

//The query returned true - now do whatever you like here.
echo 'Your score was saved. Congrats!';

}else{

//The query returned false - you might want to put some sort of error reporting here. Even logging the error to a text file is fine.
echo 'There was a problem saving your score. Please try again later.';

}

}else{
echo 'Your name or score wasnt passed in the request. Make sure you add ?name=NAME_HERE&score=1337 to the tags.';
}

mysqli_close($conn);
23.03.2020 09:47
2
1) https://xxx.cz/xxx.php?name=Boby&score=1000 (bez uvozovek)
2) google -> mysqli insert example -> první / druhý odkaz (https://www.tutorialspoint.com/mysql...sert_query.htm / https://www.w3schools.com/php/php_mysql_insert.asp)
3) používej kod tag na v komentáři ... je to čitelnější

4) Proč db_name v SQL? Však do DB ses už připojil ... ty super šikmý uvozovky v kodu bejt nemusej ... prázdná hodnota by dle mě (může mě někdo opravit) měla být NULL pro increment ....
Kód:
$sql = mysqli_query( $conn, "INSERT INTO $tbl_name (id, name, score) VALUES (NULL, '$name', '$score' )" );
23.03.2020 13:55
3
Díky za reakci, tvé rady nepomohly.

Nicméně se mi podařilo funkčnost kódu rozchodit. Problém byl v použití strip_tags a mysqli_real_escape_string. (ve starém php 5x bylo funkční, po přechodu na php 7x nikoli)

Jen pro úplnost posílám správné/funkční znění kódu:

Kód:
// Create connection
$conn = new mysqli($mysql_hostname, $mysql_username, $mysql_password, $db_name);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
                          }


if (isset($_GET["name"]) && isset($_GET["score"])){

//Lightly sanitize the GET's to prevent SQL injections and possible XSS attacks
     $name = strip_tags($_GET["name"]);
     $score = strip_tags($_GET["score"]);
     
     $sql = mysqli_query( $conn, "INSERT INTO $tbl_name (id, name, score) VALUES (NULL,'" . $name ."', '" . $score ."');" );
     
     
     if($sql){
     
//The query returned true - now do whatever you like here.
          echo 'Your score was saved. Congrats!';
          
             }
     
     else{
     
//The query returned false - you might want to put some sort of error reporting here. Even logging the error to a text file is fine.
          echo 'There was a problem saving your score. Please try again later.';
          
          }
     

                                                  }
else{
     echo 'Your name or score wasnt passed in the request. Make sure you add ?name=NAME_HERE&score=1337 to the tags.';
    }
                                                  
//Close off the MySQL connection to save resources.
mysqli_close($conn);
23.03.2020 14:24
4
funkce mysqli_real_escape_string má 2 povinné parametry v procedurálním stylu, nikoli jeden.
Navíc do sebe motáš objectové připojení (new mysqli) s procedurálním voláním dotazu na MySQL

https://www.php.net/manual/en/mysqli...ape-string.php
25.03.2020 01:23
5
Zdravím.
Tvůj kód:
- není indentovaný podle PSR
- nemá správně ošetřené vstupy
- je zranitelný vůči SQL injection
- nemá ochranu proti vkládání podvržených údajů
strip_tags() se nepoužívá jako ošetření hodnot před vkládáním řetězců a čísel do databáze.
SQL v mysqli_query() nemusí končit středníkem.
Název proměnné $sql je zvolen zmatečně, výsledkem mysqli_query() s příkazem INSERT není SQL ale výsledek vykonání dotazu.
U hlášky "Make sure you add ?name=NAME_HERE&score=1337 to the tags" slovo tags neodpovídá proměnné GET v URI requestu.
Není doporučeno hodnoty, které něco zapisují nebo obecně mění stav dat aplikace, posílat jako proměnné GET.
26.03.2020 08:14
6
Dekuji vsem za rady. Troufne si nekdo tady vlozit spravny kod dle vasich rad? Nebo se radeji obratit na nekoho kdo kod vytvori za financni uplatu?
Dekuji za pochopeni.
04.04.2020 03:37
7
radeji to smaz a nauc se php :D