php - 无法从 php 代码运行 mysql 存储过程
问题描述
无论我使用什么,我都无法从 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 变量传递值来运行存储过程,并且它必须为用户更新数据库。
解决方案
更新
我不确定你为什么要采取你所拥有的方法。无需先为变量赋值,您可以直接调用该过程,例如
$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 注入的攻击。
推荐阅读
- javascript - 使用 JS 更改 SVG 图像中的文本
- c# - 错误拆分字符串索引和长度必须引用一个位置
- android - 是否有可能在颤动中获得圆形图像的度数?
- amazon-web-services - 在同一个区域创建的两个 AWS 账户是否共享同一个 VPC?
- mysql - 如何在使用 laravel 表单请求更新数据时验证电子邮件的唯一性?
- perl - 文件存在但 Perl -e test 说不存在
- numpy - 如何获得 HSV 颜色上限和下限?
- visual-studio-code - 更改终端中运行 Python 文件的默认路径
- lua - 如何在罗技游戏 lua 脚本中设置随机循环时间?
- java - 粗体文本媒体播放器