我对mysql db真的很不好,需要帮助。

我需要从表中输入数据UPDATE表旧值+输入中的新数据。

这是我的PHP代码,我需要更改

<?php
$data = json_decode(file_get_contents("php://input"));
$zm = mysql_real_escape_string($data->zlatni_medvjed);
$ck = mysql_real_escape_string($data->crna_kraljica);
$gv = mysql_real_escape_string($data->gricka_vjestica);
$dk = mysql_real_escape_string($data->dva_klasa);

mysql_connect("localhost","root","");
mysql_select_db("medvedgrad");
mysql_query(" INSERT INTO stanje_piva(`zlatni_medvjed`, `crna_kraljica`, `gricka_vjestica`,`dva_klasa`)
VALUES('{$zm}','{$ck}','{$gv}','{$dk}') ");
?>

最佳答案

您确实应该通过使用带有准备好的语句的MySQLi或PDO来保护代码。就是说,您的问题是在打开连接之前使用mysql_real_escape_string()

mysql_real_escape_string()manual


  在没有MySQL连接的情况下执行此功能也会发出E_WARNING级PHP错误。仅在存在有效的MySQL连接的情况下执行此功能。


这意味着您应该将连接放在文件之上,

mysql_connect("localhost","root","");
mysql_select_db("medvedgrad");

$data = json_decode(file_get_contents("php://input"));
$zm = mysql_real_escape_string($data->zlatni_medvjed);
$ck = mysql_real_escape_string($data->crna_kraljica);
$gv = mysql_real_escape_string($data->gricka_vjestica);
$dk = mysql_real_escape_string($data->dva_klasa);

mysql_query(...);


处理错误

您也没有进行任何类型的错误处理或检查。我建议您在开始标记error_reporting(E_ALL);之后直接添加ini_set('display_errors', 1); <?php,这会告诉您所有警告和错误。另外,mysql_error()可以捕获从连接或查询返回的任何错误。

更安全的方法

将PDO与准备好的语句一起使用,以防止SQL注入并使用适当的现代API。从PHP 5.5开始不推荐使用mysql_*函数(并且在PHP 7中将其完全删除),如果可以的话,您应该stop using them

error_reporting(E_ALL);
ini_set('display_errors', 1);

$mysql_host = "localhost";
$mysql_username = "root";
$mysql_password = "";
$mysql_database = "medvedgrad";

// First we create the connection
$pdo = new PDO("mysql:host=".$mysql_host .";dbname=".$mysql_database .";charset=utf8", $mysql_username, $mysql_password);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$data = json_decode(file_get_contents("php://input"));
$zm = $data->zlatni_medvjed;
$ck = $data->crna_kraljica;
$gv = $data->gricka_vjestica;
$dk = $data->dva_klasa;

// Then we prepare, and execute the query
$stmt = $pdo->prepare("INSERT INTO stanje_piva (`zlatni_medvjed`, `crna_kraljica`, `gricka_vjestica`, `dva_klasa`) VALUES (:zm, :ck, :gv, :dk)");
$stmt->execute(array("zm" => $zm, "ck" => $ck, "gv" => $gv, "dk" => $dk));


这只是一个简单的示例,您还可以做一些其他事情来改进它,但这将防止SQL注入,并使用了正确的API。请注意,API不会混合使用,因此,如果您还有其他mysql_代码,也需要将其切换出来。

参考文献


http://php.net/manual/en/function.mysql-real-escape-string.php
http://php.net/manual/en/function.mysql-error.php
http://php.net/manual/en/pdo.prepare.php
How can I prevent SQL-injection in PHP?

09-05 21:56