首页 > 解决方案 > 无法从 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 变量传递值来运行存储过程,并且它必须为用户更新数据库。

标签: phpstored-proceduresmysqli

解决方案


更新

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

$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 注入的攻击。


推荐阅读