首页 > 解决方案 > 在 mariadb 存储过程中设置 PHP 变量;SQLSTATE [42S22]:未找到列

问题描述

我目前正在尝试为网站编写登录/注册功能。当使用 php 连接到 mariadb 时,我想在新用户注册时调用存储过程将数据输入数据库。在 php 中调用该过程后,我想将两个变量(电子邮件和密码)加载到该过程中。然后程序应该将它们(如果我理解正确,作为程序参数)写入相关表中。到目前为止我的代码的问题是,它似乎采用变量值(这很好)并尝试找到一个名为该值的列(这不是我想要的)而不是将这些值写入相关的列(这是我想要的)。所以我相信,一旦我了解如何在 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 Unknown column 'test' in 'field list'

标签: phpmysqlvariablesstored-proceduresmariadb

解决方案


@RaymondNijland 用这条评论解决了问题:

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

谢谢。


推荐阅读