gpt4 book ai didi

php - 在 mariadb 存储过程中设置 PHP 变量; SQLSTATE[42S22] : Column not found

转载 作者:行者123 更新时间:2023-11-29 15:43:52 25 4
gpt4 key购买 nike

我目前正在尝试为网站编写登录/注册功能。当使用 php 连接到 mariadb 时,我想在新用户注册时调用存储过程将数据输入数据库。在 php 中调用该过程后,我想将两个变量(电子邮件和密码)加载到该过程中。然后,程序应该将它们(如果我理解正确的话,作为程序参数)写入相关表中。到目前为止,我的代码的问题是,它似乎采用变量值(这很好)并尝试找到一个名为该值的列(这不是我想要的),而不是将这些值写入相关的列(这就是我想要的)。所以我相信,一旦我了解如何在 mariadb 的存储过程中正确声明变量,我就可以解决它?(是的,我已经用谷歌搜索了这个并检查了其他 stackoverflow 和 mariadb 文档,但要么我找不到它,要么它的解释方式我不明白)

我尝试在数据(电子邮件、密码)以及值(电子邮件、密码)周围添加单引号和双引号。我尝试了 INOUT 而不是仅 IN。我在 test() 和 VALUES() 中尝试将 @email 作为变量定义。我尝试更改 php 变量的名称和存储过程参数。

mariadb 存储过程:

    DELIMITER //
MariaDB [login_input]> CREATE OR REPLACE PROCEDURE test(IN email
VARCHAR(150),IN password VARCHAR(255))
-> BEGIN
-> INSERT INTO data(email, password)
-> VALUES (email, password);
-> END;
-> //

mariadb 表:

    MariaDB [login_input]> DESCRIBE data;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| email | varchar(150) | NO | PRI | NULL | |
| password | varchar(255) | NO | | NULL | |
+----------+--------------+------+-----+---------+-------+

当前为空:

    MariaDB [login_input]> SELECT * FROM data;
Empty set (0.00 sec)

相关php代码:预定义变量:

    $email = "test";
$password = "test123";

连接数据库的代码:

 try {
//connecting to server and setting error function
$conn = new PDO("mysql:host=$servername;dbname=login_input", $username, $sqlpassword);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "HEY!";
$callingstored = "CALL test($email, $password)";
$conn->exec($callingstored);
echo "HEY!";
}
// throw error in case smth fails
catch(PDOException $e)
{
echo "Sorry, connection was not established." . $e->getMessage();
}

使用 PDO 建立连接(如果这很重要)。

执行php代码时提示的错误:抱歉,未建立连接。SQLSTATE[42S22]:未找到列:1054“字段列表”中的未知列“test”

最佳答案

@RaymondNijland 通过以下评论解决了问题:

更好的是使用prepare()/execute() ...因为“CALL test($email, $password)”正在使用字符串concat,这对SQL注入(inject)不利..但我相信没有真正的方法注入(inject) CALL 但最好是安全然后抱歉。正确的?使用数据库时,始终始终始终始终始终始终始终始终始终始终使用准备好的语句(prepare()/execute())来防止SQL注入(inject),也不异常(exception)。

谢谢。

关于php - 在 mariadb 存储过程中设置 PHP 变量; SQLSTATE[42S22] : Column not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57289331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com