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
'sourcecode' 카테고리의 다른 글
{0}, {0,}을(를) 사용하여 어레이를 초기화하시겠습니까? (0) | 2023.08.11 |
---|---|
텍스트 편집 시 Android에서 이메일 주소 확인 (0) | 2023.08.11 |
models.py 을 여러 파일로 분할합니다. (0) | 2023.08.11 |
서로 다른 호스트 간에 도커 컨테이너를 이동하는 방법은 무엇입니까? (0) | 2023.08.06 |
MySQL은 항상 BIT 값을 공백으로 반환합니다. (0) | 2023.08.06 |