2017-02-22 2 views
0

저는 일반적으로 SQL 또는 Oracle 데이터베이스에 INSERT 문을 만드는 것에 익숙합니다.내 WordPress 테이블에 레코드를 어떻게 삽입합니까?

그러나 phpMyAdmin을 사용하여 WordPress의 CustomerDB 및 사용자 지정 테이블이라는 사용자 지정 데이터베이스를 만들었습니다.

다음 코드를 사용하여 사용자 지정 테이블에 레코드를 삽입하려고합니다.

오류가 발생하지 않지만 레코드가 삽입되지 않습니다.

이 시점에서 SQL 주입 공격에 대해 걱정하지 않습니다.

내 INSERT 코드가 작동하면이를 처리 할 것입니다.

누군가 다음 코드가 WordPress의 테이블에 레코드를 삽입하지 않는 이유를 알고 있습니까? 대신 따옴표

<?php 
//make database accessible 
global $wpdb; 
// Get data 
$customername = $_POST["customername"]; 
$custaddress = $_POST["custaddress"]; 
$custcity = $_POST["custcity"]; 
$custstate = $_POST["custstate"]; 
$custzip = $_POST["custzip"]; 


// Database connection 
$conn = mysqli_connect("localhost","myuser","mypass","CustomerDB"); 
if(!$conn) { 
die('Problem in database connection: ' . mysql_error()); 
} 

// Data insertion into database 
$query = "INSERT INTO ‘CustomerDB.wp_customTable’ (‘customername’, ‘custaddress’, ‘custcity’, ‘custstate’,‘custzip’) VALUES ($customername, $custaddress, $custcity, $custstate,custzip)"; 
mysqli_query($conn, $query); 

// Redirection to the success page 
header("Location: thankyou.php"); 
?> 
+0

쿠스 지프에서 '$'달러를 놓친 것처럼 보입니다. – thodic

+0

... 또한 mysql_error의 유효하지 않은 사용법, 식별자, 데이터베이스 이름 및 테이블 이름에 대한 따옴표를 따로 따로 인용 할 필요가 있습니다. SQL의 문자열 리터럴은 작은 따옴표로 묶어야하며, 실행 실패 및 오류 메시지 검색이 필요하지 않습니다. , 잠재적으로 안전하지 않은 값은 SQL 텍스트, – spencer7593

답변

0

은 성공적인 쿼리 실행을 확인하기 위해 확인하는 코드를 수정합니다. 실행 결과가 FALSE를 반환하면 오류를 검색합니다. 예를 들어

:

if (!mysqli_query($conn, $sql)) { 
    printf('Error: %s',mysqli_error($conn)); 
} 

우리에게 문제가 무엇인지 몇 가지 표시를 제공한다 mysqli_error 기능에 의해 검색된 메시지.

오류는 신비하지 않아야합니다. 우리는 뭔가 잘못 될 수 있다고 예상해야합니다. 우리 코드가 그렇게하지 않는다면, 그것의 구석에 핑키 손가락을 넣을 것입니다. Dr.Evil 스타일의 입이 있습니다. "나는 그것이 모두 계획대로 진행될 것이라고 생각합니다." "? 다음 코드가 삽입되지 않는 이유는 ..."라는 질문에


, "방법 :

작은 수정이 요구 된 질문에 대답을 향해 긴 길을 갈 것이라는 점을 추가 [행]을 삽입합니까 ... "

SQL 텍스트에는 몇 가지 문제점이 있습니다.

먼저 'smartquotes'를 버리십시오. 식별자를 이스케이프하려면 역 따옴표 문자로 묶습니다. 각 식별자는 별도로 묶어야합니다. CustomerDB은 데이터베이스 이름이고 wp_customTable는 테이블 이름 인 경우, 이것은 잘못된 것입니다 :

`CustomerDB`.`wp_customTable` 
^  ^^   ^
:

우리는 식별자를 인용하려는 경우
‘CustomerDB.wp_customTable’ 
^      ^

, 우리는 다음과 같이 별도로 식별자의 각을 인용

이러한 식별자는 유효하며 실제로는 백틱이 필요하지 않습니다. 이 경우 backticks를 생략 할 수 있습니다. 데모로 남겨 둘 것입니다.

- SQL 인젝션에 대한

국방 번호 1은 바인드 자리에 준비된 문을 사용하는 것입니다. 잠재적으로 안전하지 않은 값을 SQL 텍스트에 포함시키지 마십시오.

예 : 우리가 해야 SQL 텍스트에 포함되는 다음 바인드 자리, 어떤 잠재적으로 안전하지 않은 값으로 준비된 문을 사용할 수없는 이유가있는 경우

$sql = 'INSERT INTO `CustomerDB`.`wp_customTable` (`customername`' 
    . ', `custaddress`, `custcity`, `custstate`, `custzip`)' 
    . ' VALUES (? , ? , ? , ? , ?)'; 

if($sth = mysqli_prepare($conn,$sql)) { 
    mysqli_stmt_bind_param($sth,'sssss' 
     ,$customername 
     ,$custaddress 
     ,$custcity 
     ,$custstate 
     ,$custzip 
    ); 
    if(mysqli_stmt_execute($sth)) { 
     // statement execution successful 
    } else { 
     printf("Error: %s\n",mysqli_stmt_error($sth)); 
    } 
} else { 
    printf("Error: %s\n",mysqli_error($conn)); 
} 

제대로을 사용하여 탈출 mysqli_real_escape_string 기능.

- mysqli_connect이 실패하는 경우도

는 오류 메시지가 아닌 mysql_error를 검색 할 mysqli_connect_error 기능을 사용합니다.

+0

및 GurV에 포함되어 있습니다. 두 분께 감사드립니다. 지금 해결하려고하는 오류가 발생합니다. 나는 그것들을 해결할 수 있다고 생각하지만 다만 여기에있다 : 경고 : mysqli_stmt_bind_param() : 타입 정의 문자열에있는 요소의 수가 C : \ xampp \ htdocs \ Customers \ scripts \에있는 바인드 변수의 수와 일치하지 않는다. final.php on line 38 오류 : 준비된 명령문의 매개 변수에 대한 데이터가 제공되지 않습니다. – Tairoc

+0

동일한 코드 및 동일한 수의 필드를 사용하기 때문에 첫 번째 오류가 이상합니다. – Tairoc

+0

msyqli_bind_param의 두 번째 인수는 "유형 정의 문자열"입니다. 그것은 * 5 * '문자를 포함하는 리터럴 문자열이어야합니다 (값이 문자열로 전달된다고 가정). 3 번째에서 7 번째 인수는 제공 될 * 5 * 값입니다. 그리고 SQL 텍스트에는 * 5 개의 * 바인드 자리 표시 자 (물음표 문자)가 있습니다. 내 대답에있는 코드를보고 있는데 문제가 발생하지 않습니다. 나에게 맞는 것 같아. 이 코드를 수정했다면 mysqli_stmt_bind_param에 대한 * 7 개의 인수가 문장 핸들부터 시작하여 유형 문자열 – spencer7593

1

사용 역 따옴표 제 1 단계로

$query = "INSERT INTO CustomerDB.`wp_customTable`(`customername`, `custaddress`, `custcity`, `custstate`,`custzip`) VALUES ($customername, $custaddress, $custcity, $custstate, custzip)"; 
관련 문제