Mysql外部php api列问题-无法执行()
我已经使用php slim框架创建了一个API,它具有login.register.task添加/更新/删除功能 该模块在实时服务器上运行良好。但是,当我尝试从另一台服务器或本地主机登录/注册调用api时,工作正常,但在创建特定的用户任务时,它会给出以下错误,该任务会创建task\u id&user\u id.task-方法post错误为Mysql外部php api列问题-无法执行(),php,mysql,ajax,api,cross-domain,Php,Mysql,Ajax,Api,Cross Domain,我已经使用php slim框架创建了一个API,它具有login.register.task添加/更新/删除功能 该模块在实时服务器上运行良好。但是,当我尝试从另一台服务器或本地主机登录/注册调用api时,工作正常,但在创建特定的用户任务时,它会给出以下错误,该任务会创建task\u id&user\u id.task-方法post错误为 execute() failed: Column 'user_id' cannot be null 我的api url是 'http://creativep
execute() failed: Column 'user_id' cannot be null
我的api url是
'http://creativepixel.co.in/task_manager_angular/api2/v1/';
&任务方法get response为null
{"error":false,"tasks":[]}
我的mysql表结构如下:
user = id,name,email,password,api_key
task = id, task
user_tasks = id,user_id,task_id
这里是我的html ajax调用(在使用textfield创建任务后,在提交时我重新加载页面,页面在textfield下面加载所有任务,但在创建任务后,第三个表“user_tasks”变为空,并给出上述错误)
我的电话在这里
//Creating new task
//@param String $user_id user id to whom task belongs to
//@param String $task task text
public function createTask($user_id, $task) {
$stmt = $this->conn->prepare("INSERT INTO tasks(task) VALUES(?)");
$stmt->bind_param("s", $task);
$result = $stmt->execute();
$stmt->close();
if ($result) {
// task row created
// now assign the task to user
$new_task_id = $this->conn->insert_id;
$res = $this->createUserTask($user_id, $new_task_id);
if ($res) {
// task created successfully
return $new_task_id;
} else {
// task failed to create
return NULL;
}
} else {
// task failed to create
return NULL;
}
}
//Function to assign a task to user
//@param String $user_id id of the user
//@param String $task_id id of the task
public function createUserTask($user_id, $task_id) {
$stmt = $this->conn->prepare("INSERT INTO user_tasks(user_id, task_id) values(?, ?)");
$stmt->bind_param("ii", $user_id, $task_id);
$result = $stmt->execute();
if (false === $result) {
die('execute() failed: ' . htmlspecialchars($stmt->error));
}
$stmt->close();
return $result;
}
下面是我的php api调用函数
<?php
header('Access-Control-Allow-Origin: *');
require_once '../include/DbHandler.php';
require_once '../include/PassHash.php';
require '.././libs/Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
// User id from db - Global Variable
$user_id = NULL;
function authenticate(\Slim\Route $route) {
// Getting request headers
$headers = apache_request_headers();
$response = array();
$app = \Slim\Slim::getInstance();
// Verifying authorization Header
$db = new DbHandler();
$session = $db->getSession();
$email = $session['email'];
//if (isset($headers['authorization'])) {
if (!$db->isValidApiKey($email)) {
// api key is not present in users table
$response["error"] = true;
$response["message"] = "Access Denied. Invalid Api key";
echoRespnse(401, $response);
$app->stop();
} else {
global $user_id;
// get user primary key id
$user_id = $db->getUserId($email);
}
}
// Creating new task in db
// method POST
// params - name
// url - /tasks/
$app->post('/tasks', 'authenticate', function() use ($app) {
// check for required params
verifyRequiredParams(array('task'));
$response = array();
$task = $app->request->post('task');
global $user_id;
$db = new DbHandler();
// creating new task
$task_id = $db->createTask($user_id, $task);
if ($task_id != NULL) {
$response["error"] = false;
$response["message"] = "Task created successfully";
$response["task_id"] = $task_id;
$response["task"] = $task;
echoRespnse(201, $response);
} else {
$response["error"] = true;
$response["message"] = "Failed to create task. Please try again";
echoRespnse(200, $response);
}
});
// Verifying required params posted or not
function verifyRequiredParams($required_fields) {
$error = false;
$error_fields = "";
$request_params = array();
$request_params = $_REQUEST;
// Handling PUT request params
if ($_SERVER['REQUEST_METHOD'] == 'PUT') {
$app = \Slim\Slim::getInstance();
parse_str($app->request()->getBody(), $request_params);
}
foreach ($required_fields as $field) {
if (!isset($request_params[$field]) || strlen(trim($request_params[$field])) <= 0) {
$error = true;
$error_fields .= $field . ', ';
}
}
if ($error) {
// Required field(s) are missing or empty
// echo error json and stop the app
$response = array();
$app = \Slim\Slim::getInstance();
$response["error"] = true;
$response["message"] = 'Required field(s) ' . substr($error_fields, 0, -2) . ' is missing or empty';
echoRespnse(400, $response);
$app->stop();
}
}
请检查,您可以使用假id注册并分析代码…
用户id
不能为空。下一个问题。(您没有提供实际设置的$user\u id
位置)。@JonStirling我已经更新了postHmm底部的代码,我看到的最明显的事情是返回NULL
when execute失败,但在获取之前也不测试是否返回了任何结果,如果没有匹配的行,则获取将返回null
。使用var\u dump
查看空值的来源。然后再写回去。我很奇怪代码是一样的。在mysql上更新用户电子邮件/密码/名称。任务也会插入“任务”列中,但“用户任务”有什么问题(我尝试了var_dump($user_id,$task_id);结果为NULL int(92)execute()失败:同一服务器上的列'user_id'不能为NULL var_dumb result为int(18)int(94)
<?php
header('Access-Control-Allow-Origin: *');
require_once '../include/DbHandler.php';
require_once '../include/PassHash.php';
require '.././libs/Slim/Slim.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
// User id from db - Global Variable
$user_id = NULL;
function authenticate(\Slim\Route $route) {
// Getting request headers
$headers = apache_request_headers();
$response = array();
$app = \Slim\Slim::getInstance();
// Verifying authorization Header
$db = new DbHandler();
$session = $db->getSession();
$email = $session['email'];
//if (isset($headers['authorization'])) {
if (!$db->isValidApiKey($email)) {
// api key is not present in users table
$response["error"] = true;
$response["message"] = "Access Denied. Invalid Api key";
echoRespnse(401, $response);
$app->stop();
} else {
global $user_id;
// get user primary key id
$user_id = $db->getUserId($email);
}
}
// Creating new task in db
// method POST
// params - name
// url - /tasks/
$app->post('/tasks', 'authenticate', function() use ($app) {
// check for required params
verifyRequiredParams(array('task'));
$response = array();
$task = $app->request->post('task');
global $user_id;
$db = new DbHandler();
// creating new task
$task_id = $db->createTask($user_id, $task);
if ($task_id != NULL) {
$response["error"] = false;
$response["message"] = "Task created successfully";
$response["task_id"] = $task_id;
$response["task"] = $task;
echoRespnse(201, $response);
} else {
$response["error"] = true;
$response["message"] = "Failed to create task. Please try again";
echoRespnse(200, $response);
}
});
// Verifying required params posted or not
function verifyRequiredParams($required_fields) {
$error = false;
$error_fields = "";
$request_params = array();
$request_params = $_REQUEST;
// Handling PUT request params
if ($_SERVER['REQUEST_METHOD'] == 'PUT') {
$app = \Slim\Slim::getInstance();
parse_str($app->request()->getBody(), $request_params);
}
foreach ($required_fields as $field) {
if (!isset($request_params[$field]) || strlen(trim($request_params[$field])) <= 0) {
$error = true;
$error_fields .= $field . ', ';
}
}
if ($error) {
// Required field(s) are missing or empty
// echo error json and stop the app
$response = array();
$app = \Slim\Slim::getInstance();
$response["error"] = true;
$response["message"] = 'Required field(s) ' . substr($error_fields, 0, -2) . ' is missing or empty';
echoRespnse(400, $response);
$app->stop();
}
}
//Validating user api key
//If the api key is there in db, it is a valid key
//@param String $api_key user api key
//@return boolean
public function isValidApiKey($email) {
$stmt = $this->conn->prepare("SELECT id from users WHERE email = ?");
$stmt->bind_param("i", $email);
$stmt->execute();
$stmt->store_result();
$num_rows = $stmt->num_rows;
$stmt->close();
return $num_rows > 0;
}
/**
* Fetching user id by api key
* @param String $api_key user api key
*/
public function getUserId($email) {
$stmt = $this->conn->prepare("SELECT id FROM users WHERE email = ?");
$stmt->bind_param("s", $email);
if ($stmt->execute()) {
$stmt->bind_result($user_id);
$stmt->fetch();
// TODO
// $user_id = $stmt->get_result()->fetch_assoc();
$stmt->close();
return $user_id;
} else {
return NULL;
}
}
// Fetching all user tasks
// @param String $user_id id of the user
public function getAllUserTasks($user_id) {
$stmt = $this->conn->prepare("SELECT t.* FROM tasks t, user_tasks ut WHERE t.id = ut.task_id AND ut.user_id = ?");
$stmt->bind_param("i", $user_id);
$stmt->execute();
$tasks = $stmt->get_result();
$stmt->close();
return $tasks;
}