猿问

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


鸿蒙传说
浏览 183回答 1
1回答

眼眸繁星

更新我不确定你为什么要采用你所拥有的方法。不需要先给变量赋值,你可以直接调用这个过程,例如$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:&nbsp;$sql="SET @p0='".$path.$imageName."'; SET @p1='".$_SESSION['uid']."'; CALL `upload_image`(@p0, @p1);";&nbsp;$result = mysqli_multi_query($con,$sql);或者您可以将它们作为三个单独的查询运行:&nbsp;$sql="SET @p0='".$path.$imageName."'";&nbsp;$result = mysqli_query($con,$sql);&nbsp;$sql="SET @p1='".$_SESSION['uid']."'";&nbsp;$result = mysqli_query($con,$sql);&nbsp;$sql="CALL `upload_image`(@p0, @p1)";&nbsp;$result = mysqli_query($con,$sql);后者可能是首选,因为它mysqli_multi_query使您更容易受到 SQL 注入的攻击。
随时随地看视频慕课网APP
我要回答