2016-09-09 2 views
0

매우 바보 같은 질문입니다. 그러나이 쿼리의 동작에 실망합니다. 나는 Opencart에서 고객을 업데이트 중입니다. Update 쿼리를 작성하고 실행하면 몇 개의 필드가 삽입되고 있으며 거의 ​​업데이트되지 않습니다. 특히 '상태'와 '승인'항목을 업데이트해야합니다. 아래 쿼리를 확인하십시오.PHP 스크립트가 아닌 phpmyadmin ut에서 쿼리가 작동합니다.

UPDATE oc_customer SET customer_group_id=1,store_id=0,firstname='',lastname='HEATHER HUME',telephone='',fax='0',password='f53cbb1352950831a84035d320063383f345cfce',salt='rCF2EquoV',status='1',approved='1',date_added='2016-08-31',discount=62.00 WHERE customer_id='1418' 

무엇이 잘못 되었나요? 전화 열을 업데이트하고 상태가 아닌 승인 됨.

아래는 내 테이블의 구조

CREATE TABLE IF NOT EXISTS `oc_customer` (
    `customer_id` int(11) NOT NULL, 
    `customer_group_id` int(11) NOT NULL, 
    `store_id` int(11) NOT NULL DEFAULT '0', 
    `firstname` varchar(32) NOT NULL, 
    `lastname` varchar(32) NOT NULL, 
    `email` varchar(96) NOT NULL, 
    `telephone` varchar(32) NOT NULL, 
    `cellphone` varchar(32) NOT NULL, 
    `fax` varchar(32) NOT NULL, 
    `password` varchar(40) NOT NULL, 
    `salt` varchar(9) NOT NULL, 
    `cart` text, 
    `wishlist` text, 
    `newsletter` tinyint(1) NOT NULL DEFAULT '0', 
    `address_id` int(11) NOT NULL DEFAULT '0', 
    `custom_field` text NOT NULL, 
    `ip` varchar(40) NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    `approved` tinyint(1) NOT NULL, 
    `safe` tinyint(1) NOT NULL, 
    `token` text NOT NULL, 
    `date_added` datetime NOT NULL, 
    `discount` decimal(8,2) NOT NULL DEFAULT '0.00', 
    `tax_id` varchar(50) NOT NULL, 
    `subscribe` varchar(5) NOT NULL 
) ENGINE=MyISAM AUTO_INCREMENT=1419 DEFAULT CHARSET=utf8; 

내 PHP 코드

$query = "UPDATE oc_customer SET customer_group_id=1,store_id=0,firstname='$first_name',lastname='$last_name',telephone='$phone',fax='$fax',password='$password',salt='$salt',status=".(int)$status.",approved=".(int)$approved.",date_added='$date_added1',discount=$discount WHERE customer_id='$customer_id' "; 
mysqli_query($con,$query); 

$ 콘가 내 연결 variable.No 문제입니다.

+1

'소수의 입력란이 삽입되어 있고 거의 입력되지 않습니다.', 일부는 업데이트되고 일부는 입력되지 않음을 의미합니까? 같은 행에 있거나 다른 행에 대해 이야기하고 있습니까? PHP 코드도 게시해야합니다. – jeroen

+0

@jeroen, 즉 같은 행입니다. 전화가 업데이트되고 상태 및 승인이 업데이트되지 않습니다. – Phani

+0

@Anant, 나는 따옴표없이 또한 시도했다. 내 PHP 코드 질문을 업데이 트입니다. – Phani

답변

0

답장을 보내 주셔서 감사합니다. 쿼리에는 문제가 없습니다. 문제는 편집자 나 PhpMyAdmin에서 볼 수없는 특수 문자 때문입니다. 이는 동일한 문제, 즉 Query가 PhpMyAdmin에서 실행되고 PHP Script에서는 실행되지 않는 사람에게 도움이 될 수 있습니다. 복사 붙여 넣기 다시 다시 디버깅 쿼리 힘든하게 쿼리에 보이지 않는 특수 문자를 복사 할 수 있기 때문에

Please type the query on your own. Please don't copy and paste it from anywhere. Not atleast from your own page again. 

자신의 모든 내용을 입력하세요.

0

문자열 연결에서 변수를 캐스팅하려고하면 PHP가 항상 좋지 않을 수 있습니다. 또한 정수를 customer_id의 문자열로 취급합니다. 보조 노트로

$query = "UPDATE oc_customer SET customer_group_id=1,store_id=0,firstname='$first_name',lastname='$last_name',telephone='$phone',fax='$fax',password='$password',salt='$salt',status=".((int)$status).",approved=".((int)$approved).",date_added='$date_added1',discount=$discount WHERE customer_id=$customer_id "; 

, 그것은 그와 같은 SQL 쿼리에 변수를 주입하는 아주 나쁜 보안 방법입니다 :

이 시도해보십시오. SQL 주입 공격을 피하려면 매개 변수를 사용해야합니다.

0

코드를 실행해도 아무런 문제가없는 것으로 나타났습니다. 내 행이 상태로 성공적으로 업데이트되고 두 필드가 모두 승인되었습니다.

하지만 변수를 정수로 타입 변환하지 말 것을 제안합니다. 정수로 타입 캐스팅 할 때 동시에 문자열로 연결하기 때문에 결과적으로 문자열로만 이어질 수 있기 때문에 타입 변환이 필요하지 않습니다. PHP를 통해 해당 변수에 유효한 값을 제공하고 다음 문을 실행하여 문제가 해결되면 되돌립니다.

$query = "UPDATE oc_customer SET customer_group_id=1,store_id=0,firstname='$first_name',lastname='$last_name',telephone='$phone',fax='$fax',password='$password',salt='$salt',status=$status,approved=$approved,date_added='$date_added1',discount=$discount WHERE customer_id='$customer_id'";