Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用存储过程以使用参数PHP MySQL更新表_Php_Mysql - Fatal编程技术网

调用存储过程以使用参数PHP MySQL更新表

调用存储过程以使用参数PHP MySQL更新表,php,mysql,Php,Mysql,调用带有参数的SELECT语句非常棒,这使生活编码变得非常整洁。当我想使用update语句更新数据库中的数据时,我的问题就出现了 我有一个包含UPDATE语句的存储过程,如下所示 CREATE DEFINER = 'myuser'@'%' PROCEDURE sp_upd_planning ( IN prop_id int(11), IN planned_date varchar(15), IN time_slot int(11), IN by_who int(11), I

调用带有参数的SELECT语句非常棒,这使生活编码变得非常整洁。当我想使用update语句更新数据库中的数据时,我的问题就出现了

我有一个包含UPDATE语句的存储过程,如下所示

CREATE DEFINER = 'myuser'@'%'
PROCEDURE sp_upd_planning (
  IN prop_id int(11),
  IN planned_date varchar(15), 
  IN time_slot int(11),
  IN by_who int(11),
  IN cost decimal(15,2),
  IN complete_date varchar(15),
  IN lastupd_user varchar(100))
BEGIN
 UPDATE planning
   SET
     Status = CASE 
                  WHEN CompleteDate IS NOT NULL THEN 4 
                  WHEN PlannedDate IS NULL THEN 2 
                  WHEN PlannedDate IS NULL AND CompleteDate IS NULL THEN 3 
                END
    ,PlannedDate = planned_date
    ,BookingDate = NOW()
    ,TimeSlot = time_slot
    ,ByWho = by_who
    ,Cost = epc_cost
    ,Complete = CASE WHEN CompleteDate IS NOT NULL THEN 1 ELSE 0 END
    ,CompleteDate = complete_date
    ,LastUpdateDate = NOW()
    ,LastUpdateUser = lastupd_user
  WHERE PropID = prop_id;
END
当我运行调用sp_upd_planning(这里的参数)时,该语句会正常工作;在数据库中

我使用的是表单提交,我已经将相关字段发布到变量中,在连接中我再次调用存储的Proc,与之前一样,在数据库中我使用变量来匹配所需的参数,就像这样(是的,我知道它使用的是mysql,但我想快速测试,所以我使用了这个)

当代码执行时,一切看起来都很好,没有错误,并且主窗体按照我设置的jquery提交,但是当我检查数据库时,没有任何更新


为什么会这样?

听起来好像你没有执行你的语句。在PHP中,创建后仍然必须执行语句。如果我没记错的话,绑定参数比在字符串中传递参数更安全。试着这样做:

$conn = new mysqli("mysql:host=$host;dbname=$dbname", $username, $password);
// execute the stored procedure
$sql = "CALL sp_upd_planning(:planned, :timeslot, :bywho, :cost, :completed, :inputby, :propid)";
$stmt = $conn->prepare($sql);

$stmt->bindParam('datatypes', $planned, $timeslot, $bywho, $cost, $completed, $inputby, $propid);
$stmt->execute();

基本上,根据术语datatypes,让我们假设计划是一个字符串,时隙是一个日期/时间,bywho是一个字符串,cost是一个int,completed是一个int,inputby是一个字符串,propid是一个int,然后它会说'sdsiisi'

调试
$sql='call sp_upd_planning('$planning',…'
并通过回显
$sql
查看是否所有参数都设置正确。谢谢,我回显了该语句,并将输出与应输入的内容进行了比较,结果是正确的,我尝试使用输出手动更新,但也失败了。问题是,该语句应该遵循哪个顺序,应该是哪个顺序我在更新?排序中声明了参数或顺序,在更改了发送参数的方式以匹配我在存储过程中定义它们的方式后,它开始工作。感谢@RavinderThank的帮助,感谢您的回复,我没有正确执行存储过程,我将变量设置为SQL语句,而不是参数的设置方式在SQL语句中,propid是第一个,而不是最后一个
$conn = new mysqli("mysql:host=$host;dbname=$dbname", $username, $password);
// execute the stored procedure
$sql = "CALL sp_upd_planning(:planned, :timeslot, :bywho, :cost, :completed, :inputby, :propid)";
$stmt = $conn->prepare($sql);

$stmt->bindParam('datatypes', $planned, $timeslot, $bywho, $cost, $completed, $inputby, $propid);
$stmt->execute();