【问题标题】:PHP insert into MySQL database with RESTPHP 使用 REST 插入 MySQL 数据库
【发布时间】:2023-04-01 16:17:01
【问题描述】:

我正在尝试使用 RESTful Web 服务测试插入数据库。我跟着这个教程https://trinitytuts.com/build-first-web-service-php/ 每当我发布数据时,我都会成功返回,但数据库不显示信息(即它创建了一个条目,但所有字段都是空白的)。我 75% 确定它是 Advanced Rest Client,但我不知道它有什么问题。这是代码/发布命令。

帖子字符串是 name=Apple&email=banna%40orange.com&pwd=12345&status=ok,我使用 Advanced Rest Client 发送它的图片。

confi.php 文件

 <?php
 $conn = mysqli_connect("localhost", "root", "", 'tuts_rest');
 ?>

其余代码

        <?php

include_once('confi.php');

if($_SERVER['REQUEST_METHOD'] == "POST"){
$name = isset($_POST['name']) ? mysqli_real_escape_string($_POST['name']) : "";
$email = isset($_POST['email']) ? mysqli_real_escape_string($_POST['email']) : "";
$password = isset($_POST['pwd']) ? mysqli_real_escape_string($_POST['pwd']) : "";
$status = isset($_POST['status']) ? mysqli_real_escape_string($_POST['status']) : "";

 // Insert data into data base
 $sql = "INSERT INTO users (ID, name, email, password, status) VALUES ('' , '" . $name . "', '" . $email . "', '" . $password . "', '" . $status . "');";
 $qur = $conn->query($sql);
 if($qur){
 $json = array("status" => 1, "msg" => "Done User added!");
 }else{
 $json = array("status" => 0, "msg" => "Error adding user!");
 }
}else{
 $json = array("status" => 0, "msg" => "Request method not accepted");
}

mysqli_close($conn);

/* Output header */
 header('Content-type: application/json');
 echo json_encode($json);
?>

谢谢!

【问题讨论】:

  • 如果可以的话,你应该stop using mysql_* functions。它们不再被维护并且是officially deprecated。改为了解 prepared statements,并考虑使用 PDO,it's really not hard。
  • $sql = "INSERT INTO users (ID, name, email, password, status) VALUES ('' , '" . $name . "', '" . $email . "', '" . $password . "', '" . $status . "');";
  • 请不要发布屏幕截图,尤其是难以辨认的屏幕截图,除非演示文稿与问题相关。还有那个教程教你非常坏的习惯,那种风格的 PHP 是直接从 1990 年代出来的,所以请不要使用它。像PHP the Right Way 这样的指南可以帮助解释现代最佳实践。学习和使用像Laravel 这样的development framework 将大大提高您的工作效率。
  • 警告:使用mysqli 时,您应该使用参数化查询和bind_param 将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您将创建严重的SQL injection bugs。 切勿将$_POST 数据直接放入查询中,并避免使用手动转义,因为一个错误可能会造成混乱。

标签: php mysql json post


【解决方案1】:

使用我的代码代替这个(我更改了您的所有代码并增加了额外的安全性,无论您是否可以根据需要删除标题)。在这里,您可以轻松地将 json 格式的数据插入数据库。 在 Advance rest 客户端中,您会看到一个按钮 Raw,您可以在其中编写 json 数据类型。对于这个例子,

{
      "name": "Ashraf",
      "email":"ash@yahoo.coom",
      "pwd": "1234",
      "status": "nice"
  }

现在点击发送按钮,您的数据将被插入到您的数据库中

<?php

// Include confi.php
include_once('confi.php');
// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
	// Get data
	$content=trim(file_get_contents("php://input"));
	$data = json_decode($content, true);

if(
    !empty($data['name']) &&
    !empty($data['email']) &&
    !empty($data['pwd']) &&
    !empty($data['status'])
){
	$name=$data['name'];
	$email=$data['email'];
	$password=$data['pwd'];
	$status=$data['status'];


	// Insert data into data base
	$sql = "INSERT INTO users (name, email, password, status) VALUES (? , ?, ?, ?)";
	$qur=mysqli_query($conn,$sql);
	
//sanitize
	  $name=htmlspecialchars(strip_tags($name));
       $email=htmlspecialchars(strip_tags($email));
       $password=htmlspecialchars(strip_tags($password));
       $status=htmlspecialchars(strip_tags($status));
  	//bind values 
   $stmt = $conn->prepare($sql);
  	if($stmt)
  	{	
	  	$stmt->bind_param("ssss", $name, $email, $password,$status);
		
		if($stmt->execute())
		{
			$json = array("status" => 1, "msg" => "Done User added!");
		}
		else
		{
			$json = array("status" => 0, "msg" => "Error adding user!");
		}
	}
	else
	{
		$json = array("status" => 0, "msg" => "Request method not accepted");
	}
}


@mysqli_close($conn);

/* Output header */
	header('Content-type: application/json');
	echo json_encode($json);
?>

【讨论】:

    【解决方案2】:

    因为您使用的是mysql_real_escape_string。该功能已弃用。您可以使用mysqli_real_escape_string 代替。

    【讨论】:

    • 尝试捕获所有错误,您可能会收到错误消息。通过错误报告(E_ALL);
    • 很好,尝试更新到所有 mysqli 但似乎我错过了那个重要的。遗憾的是没有修复它,我认为它与我的 _Post 有效负载有关。
    • 否。不要将addslashes 用于与 SQL 相关的任何内容。
    【解决方案3】:

    感谢大家的帮助!我有它的工作,虽然我不明白。问题确实出在我的 Advanced Rest Client 应用程序中。我将有效负载作为 application/json 发送,但没有获取 POST 数据,但是当我将 Content-Type 更改为 application/x-www-form-urlencoded 时,它起作用了。如果有人想解释为什么要修复它,我会很感激,我相信其他人也会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 2020-11-23
      • 2018-11-09
      • 2016-12-12
      • 2015-10-24
      • 2011-06-15
      相关资源
      最近更新 更多