PDA

View Full Version : Vấn đề khi xử lí giá trị có nhiều kí tự phức tạp?



whisky_x
15-09-2011, 22:25
Mình muốn replace một vài giá trị trong SQL nhưng khi truy vấn nhưng bị báo lỗi sai cú pháp, vì giá trị tìm kiếm và thay thế của mình có nhiều kí tự " nên khi query SQL không hiểu lệnh bắt đầu và kết thúc chỗ nào:


SELECT REPLACE(option_value, '<script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>', '<script type="text/javascript"><!-- google_ad_client = "pub-22038******xx";google_ad_slot = "6661998542";google_ad_width = 728;google_ad_height = 90;//--></script>')
FROM wp_options;

Ví dụ mình query command như trên thì báo lỗi SELECT REPLACE(option_value, '<script type="text/javascript"><!-- amazon_ad_tag = "whisky"

Mong các bác hướng dẫn cho có cách nào để giải quyết vấn đề này không? Xin cảm ơn.

Red Devilic
16-09-2011, 09:27
Câu SELECT của bạn mới chỉ đưa ra giá trị cần REPLACE, chưa thấy đưa ra giá trị REPLACE tương ứng nên báo lỗi cú pháp.

Ngoài ra nếu trong chuỗi xử lý có dấu ' thì bạn sử dụng 2 dấu ' để kí hiệu ' là phần tử trong chuỗi chứ không phải kí hiệu kết thúc chuỗi.

Ví dụ SELECT 'I''m a boy';

Van8Hien62
16-09-2011, 12:22
Query trên sai cú pháp - syntax -. Một kỹ thuật cổ điển thường dùng là "sql injection" : subString "--" trong Sql là comment line ==> lỗi cú pháp.

Còn trong chuỗi có dấu ' hay " thì như Red Devilic nói ở trên.

Văn Hiền.

tuan-nda
20-09-2011, 12:24
Câu SELECT của bạn mới chỉ đưa ra giá trị cần REPLACE, chưa thấy đưa ra giá trị REPLACE tương ứng nên báo lỗi cú pháp.

Ngoài ra nếu trong chuỗi xử lý có dấu ' thì bạn sử dụng 2 dấu ' để kí hiệu ' là phần tử trong chuỗi chứ không phải kí hiệu kết thúc chuỗi.

Ví dụ SELECT 'I''m a boy';

Bạn Red Devilic trả lời chuẩn quá.
Xin nói thêm. Đúng là chuỗi của bạn quá phức tạp, khó kiểm tra.
Để không báo lỗi trước khi đưa biến vào hàm. Bạn phải chịu khó thực hiện từng bước.
Trường hợp của bạn, Sql sẽ trả về lỗi cú pháp là đúng. Không hiểu 'option_value' là gì?
Chưa xét đến tham số 2 và 3 theo. Việc của bạn là:
1/ Xem lại cú pháp của hàm Replace.
2/ Việc bắt SQL thực hiện như vậy có quá đáng hay không Hoặc có cần thiết phải như thế không. Hí Hí
Thân chào.

Van8Hien62
20-09-2011, 15:31
Bạn Red Devilic trả lời chuẩn quá. là một mệnh đề sai, sai hoàn toàn !

Câu query sai do "sql injection", QUOTED_IDENTIFIER default ON. Còn về ngữ nghĩa là đúng, chỉ cần bật :

SET QUOTED_IDENTIFIER OFF
cho phép dùng lẫn ' với " như trong VB, PHP là chạy được - khử bỏ lỗi "sql injection"


/*
SELECT REPLACE(option_value, '<script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>', '<script type="text/javascript"><!-- google_ad_client = "pub-22038******xx";google_ad_slot = "6661998542";google_ad_width = 728;google_ad_height = 90;//--></script>')
FROM wp_options;
*/
SET QUOTED_IDENTIFIER OFF
--
declare @x nvarchar(100), @y nvarchar(100), @z nvarchar(100);
set @x = N'Kiểm tra mệnh đề : Bạn Red Devilic trả lời chuẩn quá là sai! C/m : <script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>';
set @y = '<script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>';
set @z = '<script type="text/javascript"><!-- google_ad_client = "pub-22038******xx";google_ad_slot = "6661998542";google_ad_width = 728;google_ad_height = 90;//--></script>';
--
SELECT REPLACE(@x, @y, @z)
-- FROM wp_options;
as KetQua;


tuan-nda chắc không rành về SQL nên thấy cái đúng mà cho rằng nó sai, nên phân tích lại thên tệ.

Xin nói thêm. Đúng là chuỗi của bạn quá phức tạp, khó kiểm tra.
Để không báo lỗi trước khi đưa biến vào hàm. Bạn phải chịu khó thực hiện từng bước.
Trường hợp của bạn, Sql sẽ trả về lỗi cú pháp là đúng. Không hiểu 'option_value' là gì?
Chưa xét đến tham số 2 và 3 theo. Việc của bạn là:
1/ Xem lại cú pháp của hàm Replace.
2/ Việc bắt SQL thực hiện như vậy có quá đáng hay không Hoặc có cần thiết phải như thế không
???


Link: http://tinyurl.com/4xnkagz
Thứ trưởng Bộ Y tế tự phong mình là tiến sĩ : GD - DT !

chip07
20-09-2011, 16:20
là một mệnh đề sai, sai hoàn toàn !

Câu query sai do "sql injection", QUOTED_IDENTIFIER default ON. Còn về ngữ nghĩa là đúng, chỉ cần bật :

SET QUOTED_IDENTIFIER OFF
....

Link: http://tinyurl.com/4xnkagz
Thứ trưởng Bộ Y tế tự phong mình là tiến sĩ : GD - DT !


Rất nhiều lần muốn nói mà nghĩ lại thấy chán chẳng thèm nói rồi.
Ko hiểu người ở đâu nữa, phát biểu được 10 câu thì 9 câu vòng vo tam quốc, sốt ruột, sốt ruột.

Van8Hien62
20-09-2011, 16:27
Bạn có biết SQL, tôi sửa trên là sai, hay bạn không biết chạy, exec query ?

Lagi2
20-09-2011, 22:41
Đúng là thầy bói mù, xem voi ( họ thấy cái đúng của họ ) nên cãi nhau. Hơn thế họ phê phán, biện chứng như các bạn thấy trên.

Khác với người khiếm thị - khiếm khuyết nên có thể thông cảm - còn ở đây là những chuyên viên, chuyên gia i-tờ, bình dân học vụ, họ tưởng kiến thức của họ ghê gớm, kinh hồn ( trong khi chưa thuộc hết từ khóa - Reserved Keywords, khái niệm cơ sở - IDENTIFIER, ... ) nên bình phẩm, chê cái đúng của người khác.

chip07
21-09-2011, 08:54
Đúng là thầy bói mù, xem voi ( họ thấy cái đúng của họ ) nên cãi nhau. Hơn thế họ phê phán, biện chứng như các bạn thấy trên.

Khác với người khiếm thị - khiếm khuyết nên có thể thông cảm - còn ở đây là những chuyên viên, chuyên gia i-tờ, bình dân học vụ, họ tưởng kiến thức của họ ghê gớm, kinh hồn ( trong khi chưa thuộc hết từ khóa - Reserved Keywords, khái niệm cơ sở - IDENTIFIER, ... ) nên bình phẩm, chê cái đúng của người khác.

Đây là diễn đàn tin học chứ ko phải văn chương khoe chữ. Bạn vui lòng nói rõ được ko? Lấp la lấp lửng, đọc đến 5 lần mà vẫn ko hiểu ý của bạn cuối cùng là gì nữa.

Lagi2
21-09-2011, 09:06
Chỉ cần thêm thiết lập : SET QUOTED_IDENTIFIER OFF vào là query trên là chạy được - whisky_x viết đúng - chỉ thiếu tùy chọn môi trường
-- Thiết lập môi trường :
SET QUOTED_IDENTIFIER OFF
-- Copy nguyên văn query whisky_x viết ở trên :
SELECT REPLACE(option_value, '<script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>', '<script type="text/javascript"><!-- google_ad_client = "pub-22038******xx";google_ad_slot = "6661998542";google_ad_width = 728;google_ad_height = 90;//--></script>')
FROM wp_options;
//Code trên chạy rất tốt.
Sai chỗ nào hỡi các CHUYÊN DA Ms Sql Server ?!

Chuyên viên i-tờ, bình dân học vụ đọc không biết cái nào sai, chỗ nào đúng nên đọc đến 5 lần mà vẫn ko hiểu là đương nhiên. Thầy bói xem voi.

tuan-nda
21-09-2011, 12:47
@Văn Hiền:
Làm được hãy nói Hiền nhé. Không bị cho là ăn nhiều hơn học đấy.
Lên đây là trao đổi kiến thức. Hiền có chắc là giỏi không mà hênh hoang thế.
Cảm ơn Hiền đã đóng góp ý kiến cho diễn đàn.
(Chắc Hiền còn nhỏ tuổi nên tôi không dám nói thêm)

Van8Hien62
21-09-2011, 13:42
/*
Trường hợp của bạn, Sql sẽ trả về lỗi cú pháp là đúng. Không hiểu 'option_value' là gì?
Chưa xét đến tham số 2 và 3 theo. Việc của bạn là:
1/ Xem lại cú pháp của hàm Replace.
2/ Việc bắt SQL thực hiện như vậy có quá đáng hay không Hoặc có cần thiết phải như thế không. Hí Hí
*/

"Không hiểu 'option_value' là gì ?" trong ngữ cảnh
SELECT REPLACE(option_value, @st1, @st2) from wp_options;
là không biết SQL là gì thật, nên phán bừa "Xem lại cú pháp của hàm Replace". Cứ đem sở học ra mà nói, cần chi dựa hơi ai( Bạn Red Devilic trả lời chuẩn quá, Sql sẽ trả về lỗi cú pháp ), rồi tự khen mình giỏi, khuyên dạy người khác : "có cần thiết phải như thế không. Hí Hí" - trong khi người ta viết đúng, chỉ sai tiểu tiết - là thiếu option. Ghê thay sự lạ!

- Chắc Hiền còn nhỏ tuổi nên tôi không dám nói thêm.
Sinh trước, già trước(, lú trước). Có gì là hay, muốn làm lão làng sao, lấy tuổi ra thay kiến thức ?

tuan-nda
21-09-2011, 16:27
@vănHie62n
Sinh trước, già trước(, lú trước).
Chắc Hiền cũng nghĩ về Bố của bạn như thế àh! Thật đáng tự hào những ông bố có đứa con hiếu thảo như vậy! :-(
Nói chung Hiền nông cạn nên tôi có diễn giải gì thêm thì cũng không hiểu đâu.
Một chiều buồn!

Van8Hien62
21-09-2011, 16:34
Đó là chân lý hiển nhiên, có gì phải nghĩ.
Sinh trước, già trước(, lú trước, chết trước).
Một quy luất phổ quát.

Tôi nông cạn, mà còn hơn khối người - tự cho mình tài - chê bai người khác.

chip07
22-09-2011, 09:03
Tôi nông cạn, mà còn hơn khối người - tự cho mình tài - chê bai người khác.

Lại nói về cái khoản 'tự cho mình tài - chê bai người khác' thì trong cái diễn đàn này ko chắc mấy người hơn được Van8Hien62. Bạn thử dành thời gian đọc lại những bài post của mình xem, đọc thì nhanh thôi, tôi chẳng có thời gian trích dẫn ở đây.

Nói chung dốt thì còn học dần được, chứ còn cái kiểu người lúc nào cũng cho mình là nhất - nhất - nhất này thì 'núi non dễ dời - bản tính khó đổi', muôn đời vẫn vậy thôi. Tôi nhận ra cái giọng điệu thích dạy đời của bạn từ những cái comment đầu tiên tôi gặp, nhưng thiết nghĩ 'người đời', tôi cũng chẳng mua việc vào người làm gì. Nhưng nói thật là bạn cũng nên kiềm chế một chút, nghe chối ko thể tả. Bạn có người bạn nào ko? Bật cái 4rum này, bảo người ta đọc những cái comment của bạn, bảo họ khách quan nói một câu công bằng xem nào.

Van8Hien62
22-09-2011, 14:48
Nói chung dốt thì còn học dần được, chứ đừng dạy cái dốt đó cho người khác, đừng chỉ người khác đi lạc, đường quang ..đâm quàng vào bụi.

Đây là DĐTH, nói về Ms SQL server - không phải là nơi nói đạo đức - nói đến đúng - sai trong SQL, trao đổi về kinh nghiệm, kỹ thuật, kiến thức cho nhau thôi. Đạo đức vẫn đang được nói ở box - topic khác.

Cám ơn bạn đã đọc các bài viết của tôi. Nếu nó có giúp được gì cho bạn, thì coi như tôi trả được phần nào công ơn cho những người dạy tôi.

Khi tôi đọc, tôi cũng học được những ý kiến hay, mặt khác là cách ôn lại kiến thức đã biết.

Dạy đời ? Tôi dạy - tôi lấy tiền, chưa dạy không đâu ! Dạy ở chỗ khác, đây là diễn dàn, nơi tranh luận. Không ai bắt bạn nghe, còn phản đối cứ thẳng thắn tranh luận. Số người -số lần - đọc các bài viết đến hàng chục ngàn , vài chục người chửi thì ăn nhằm gì - chửi vì quê độ, ..

Ai chỉ cái sai của tôi là thầy tôi.

manucial
08-10-2011, 15:24
ồ, cảm ơn bạn rất nhiều, đọc bài của bạn mà mình thấy hiểu ra rất nhiều điều.

là một mệnh đề sai, sai hoàn toàn !

Câu query sai do "sql injection", QUOTED_IDENTIFIER default ON. Còn về ngữ nghĩa là đúng, chỉ cần bật :

SET QUOTED_IDENTIFIER OFF
cho phép dùng lẫn ' với " như trong VB, PHP là chạy được - khử bỏ lỗi "sql injection"


/*
SELECT REPLACE(option_value, '<script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>', '<script type="text/javascript"><!-- google_ad_client = "pub-22038******xx";google_ad_slot = "6661998542";google_ad_width = 728;google_ad_height = 90;//--></script>')
FROM wp_options;
*/
SET QUOTED_IDENTIFIER OFF
--
declare @x nvarchar(100), @y nvarchar(100), @z nvarchar(100);
set @x = N'Kiểm tra mệnh đề : Bạn Red Devilic trả lời chuẩn quá là sai! C/m : <script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>';
set @y = '<script type="text/javascript"><!-- amazon_ad_tag = "whisky"; amazon_ad_width = "160"; amazon_ad_height = "600";//--></script> <script type="text/javascript" src="http://www.assoc-amazon.co.uk/s/ads.js"></script>';
set @z = '<script type="text/javascript"><!-- google_ad_client = "pub-22038******xx";google_ad_slot = "6661998542";google_ad_width = 728;google_ad_height = 90;//--></script>';
--
SELECT REPLACE(@x, @y, @z)
-- FROM wp_options;
as KetQua;


tuan-nda chắc không rành về SQL nên thấy cái đúng mà cho rằng nó sai, nên phân tích lại thên tệ.

Xin nói thêm. Đúng là chuỗi của bạn quá phức tạp, khó kiểm tra.
Để không báo lỗi trước khi đưa biến vào hàm. Bạn phải chịu khó thực hiện từng bước.
Trường hợp của bạn, Sql sẽ trả về lỗi cú pháp là đúng. Không hiểu 'option_value' là gì?
Chưa xét đến tham số 2 và 3 theo. Việc của bạn là:
1/ Xem lại cú pháp của hàm Replace.
2/ Việc bắt SQL thực hiện như vậy có quá đáng hay không Hoặc có cần thiết phải như thế không
???


Link: http://tinyurl.com/4xnkagz
Thứ trưởng Bộ Y tế tự phong mình là tiến sĩ : GD - DT !