sourcecode

mariadb 스토어드 프로시저에서 PHP 변수 설정; SQLSTATE [42S22]:열을 찾을 수 없음

codebag 2023. 8. 11. 21:45
반응형

mariadb 스토어드 프로시저에서 PHP 변수 설정; SQLSTATE [42S22]:열을 찾을 수 없음

현재 웹사이트 로그인/등록 기능을 작성하려고 합니다.php로 mariadb에 연결할 때 새로운 사용자가 등록할 때 db에 데이터를 입력하는 저장 프로시저를 부르고 싶습니다.php로 프로시저를 호출하면 프로시저에 두 가지 변수(이메일과 비밀번호)를 로드하고 싶습니다.그런 다음 절차는 (제가 올바르게 이해한 경우 절차 매개변수로) 관련 표에 기록해야 합니다.지금까지 제가 가지고 있는 코드의 문제는 변수 값(좋은 것)을 관련 열(내가 원하는 것)에 쓰는 대신 그 값(내가 원하는 것)과 같은 이름의 열(내가 원하는 것)을 찾으려고 하는 것 같습니다.그래서 저는 mariadb의 저장 프로시저에서 변수를 올바르게 선언하는 방법을 이해하는 즉시 해결할 수 있다고 생각합니다.(예, 저는 이것을 구글에 검색하여 스택 오버플로와 mariadb 설명서를 확인했지만 찾을 수 없거나 이해할 수 없는 방식으로 설명되었습니다.)

저는 데이터(이메일, 비밀번호)와 VALUE(이메일, 비밀번호) 주위에 단일 따옴표와 이중 따옴표를 붙여 보았습니다.저는 IN만 하지 않고 IN OUT를 해봤습니다.저는 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";

DB에 연결하기 위한 코드:

 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 '필드 목록'에서 '테스트' 열을 알 수 없습니다.

@RaymondNijland는 다음과 같은 논평을 통해 문제를 해결했습니다.

prepare()/execute() ...를 사용하는 것이 좋습니다."CALL test($email, $password)"에서 SQL 주입에 좋지 않은 문자열 concat을 사용하고 있습니다.하지만 나는 CALL을 주입할 방법이 없다고 생각하지만, 미안한 것보다 안전한 것이 더 낫다고 생각합니다. 그렇죠?데이터베이스 작업 시 항상 항상 항상 항상 항상 항상 항상 항상 준비된 문(prepare()/execute())을 사용하여 SQL 주입을 방지합니다.

감사해요.

언급URL : https://stackoverflow.com/questions/57289331/setting-php-variable-in-mariadb-stored-procedure-sqlstate42s22-column-not-fo

반응형