为了账号安全,请及时绑定邮箱和手机立即绑定

无法从 php 代码运行 mysql 存储过程

无法从 php 代码运行 mysql 存储过程

PHP
鸿蒙传说 2021-12-03 19:27:38
无论我使用什么,我都无法从 PHP 运行 MySQL 存储过程。我来自 .Net 背景并且不太熟悉 PHP。如果我从 PHP 尝试相同的查询,它不起作用,而如果我在 PHPMyAdmin 中的 SQL 编辑器中尝试它工作正常。<?php     $sql="SET @p0='".$path.$imageName."'; SET @p1='".$_SESSION['uid']."'; CALL `upload_image`(@p0, @p1);";     $result = mysqli_query($con,$sql);?>并在 Mysql Phpmyadmin 中尝试了这个,它有效:-SET @p0='images/user/Ganesh_1566681875.png'; SET @p1='1'; CALL `upload_image`(@p0, @p1);这是我的存储过程:-CREATE DEFINER=`root`@`localhost` PROCEDURE `upload_image`(IN `imagepath` VARCHAR(250), IN `userid` INT)BEGIN    UPDATE user SET profile_image_path = imagepath WHERE id = userid;END$$DELIMITER ;我必须能够通过从 PHP 变量传递值来运行存储过程,并且它必须为用户更新数据库。
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

更新


我不确定你为什么要采用你所拥有的方法。不需要先给变量赋值,你可以直接调用这个过程,例如


$sql = "CALL `upload_image`('$path.$imageName', $_SESSION['uid'])";

$result = mysqli_query($con,$sql);

无论如何,最好使用准备好的语句来保护自己免受 SQL 注入。像这样的东西:


$stmt = $con->prepare("CALL `upload_image(?, ?)");

$stmt->bind_param("si", $path.$imageName, $_SESSION['uid']);

$stmt->execute();

$result = $stmt->get_result();

此外,您的存储过程只是一个语句,这意味着直接执行该语句会更好:


$stmt = $con->prepare("UPDATE user SET profile_image_path = ? WHERE id = ?;");

$stmt->bind_param("si", $path.$imageName, $_SESSION['uid']);

$stmt->execute();

$result = $stmt->get_result();

原答案


您的问题是您正在尝试运行不支持的三个单独的查询(每个都SET算作一个查询)mysqli_query。您有两个选择,可以使用mysqli_multi_query:


 $sql="SET @p0='".$path.$imageName."'; SET @p1='".$_SESSION['uid']."'; CALL `upload_image`(@p0, @p1);";

 $result = mysqli_multi_query($con,$sql);

或者您可以将它们作为三个单独的查询运行:


 $sql="SET @p0='".$path.$imageName."'";

 $result = mysqli_query($con,$sql);

 $sql="SET @p1='".$_SESSION['uid']."'";

 $result = mysqli_query($con,$sql);

 $sql="CALL `upload_image`(@p0, @p1)";

 $result = mysqli_query($con,$sql);

后者可能是首选,因为它mysqli_multi_query使您更容易受到 SQL 注入的攻击。


查看完整回答
反对 回复 2021-12-03
  • 1 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信