【问题标题】:Php mysqli and stored-procedurephp mysqli 和存储过程
【发布时间】:2011-02-12 18:19:56
【问题描述】:

我有一个存储过程:

Create procedure news(in dt datetime,in title varchar(10),in desc varchar(200))

Begin
Insert into news values (dt,title,desc);
End

现在我的 php:

$db = new mysqli("","","","");

$dt = $_POST['date'];
$ttl = $_POST['title'];
$desc = $_POST['descrip'];
$sql = $db->query("CALL news('$dt','$ttl','$desc')");
if($sql)
{
echo "data sent";

}else{
echo "data not sent";

}

我是php新手,请帮忙谢谢

我的 php 不起作用,我不断收到“数据未发送”消息。我做错了什么吗?

【问题讨论】:

    标签: php mysql stored-procedures mysqli


    【解决方案1】:

    首先想到的可能不是唯一的问题:

    $db = new mysqli("","","","");
    

    应该是这样的

    $db = new mysqli("localhost","username","pa$$w0rd","database_name");
    

    或者如果你有your ini set up correctly (see ini_get() default values)

    $db = new mysqli();
    

    编辑:顺便说一句,您可能真的想始终使用参数化查询(或通常只是转义您的输入),您的“CALL”查询将用户输入直接写入查询,您' 很容易受到 SQL 注入的影响。想象一下如果有人将Description'); DELETE FROM news WHERE (title LIKE '% 放入$_POST['descrip'] 会发生什么:

    $sql = $db->query("CALL news('...','...','Description'); DELETE FROM news WHERE (title LIKE '%')");
    

    不太好。

    【讨论】:

    • 我假设他只是删除了他的凭据,因为您不应该在 SO 上发布您的数据库用户/传递。
    • @Pachonk:虽然我不记得三年前的确切想法,但我已经习惯人们像我一样将占位符放入构造函数中。 :) (......而且老实说,人们已经习惯了真正犯这样的错误。)显然绝对同意一个人不应该在 stackoverflow 上分享真实的凭据——那将是一个可怕的错误。
    【解决方案2】:

    我想你在哪里

    $sql = $db->query("CALL news('$dt','$ttl','$desc')");
    

    你需要

    $sql = $db->query("CALL news('".$dt."','".$ttl."','".$desc."')");
    

    第一个失败是因为您发送了一个字符串 '$dt' 作为日期时间(以及 '$tt1' 和 '$desc' 作为字段值)。

    【讨论】:

    • 虽然这两个语句是等价的 - 查询字符串是用双引号引起来的,所以变量将被很好地替换...
    • 你说的很对,约翰,现在我再试一次。出于某种原因,当我第一次这样做时,它有所作为。手指有问题,我想。
    猜你喜欢
    • 2015-12-17
    • 2017-12-07
    • 2014-06-05
    • 2012-04-16
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多