2010-02-08 6 views
7

यह क्योंकि sqlite3_prepare_v2 जैसे एक बयान तैयार करने के लिए विफल रहता है sqlite3_bind_text एक तालिका नाम करना असंभव है:क्या किसी तालिका के नाम को उद्धृत/भागने के लिए कोई सी SQLite API है?

SELECT * FROM ? ; 

मुझे लगता है तालिका नाम बयान पार्स करने के लिए की जरूरत है, तो के हवाले जरूरतों sqlite3_prepare_v2 से पहले हुआ है करने के लिए।

क्या sqlite3_quote_tablename जैसा कुछ है? हो सकता है कि यह पहले से ही एक ऐसे नाम के तहत मौजूद है जिसे मैं पहचान नहीं सकता, लेकिन मुझे फ़ंक्शंस सूची में कुछ भी नहीं मिला।

+1

आपके प्रस्तावित sqlite3_quote_tablename फ़ंक्शन एसक्यूएल इंजेक्शन हमलों को रोकने के लिए इनपुट को संचरित कर सकता है। ऐसा करने के लिए यह सुनिश्चित करने के लिए इनपुट को पार्स कर सकता है कि यह एक स्ट्रिंग अक्षर है। http://www.sqlite.org/lang_expr.html#litvalue – momeara

+0

बहुत देर से प्रतिक्रिया: धन्यवाद, वह मार्ग मैंने लिया था। हालांकि, मेरे पूर्व नियोक्ता के पास उस कोड का मालिक है। यदि आप इसे उत्तर के रूप में पोस्ट करना चाहते हैं, तो मैं इसे स्वीकार करूंगा :) – gavinbeatty

उत्तर

1

अपने प्रस्तावित sqlite3_quote_tablename समारोह एसक्यूएल इंजेक्शन हमले से बचने के लिए इनपुट स्वच्छ सकता है। ऐसा करने के लिए यह सुनिश्चित करने के लिए इनपुट को पार्स कर सकता है कि यह एक स्ट्रिंग अक्षर है। http://sqlite.org/lang_expr.html#litvalue

+0

टी वह जवाब देता है कि मेरा प्रस्तावित कार्य मौजूद नहीं है, और लिंक इसे लागू करने के लिए एक उपयोगी गाइड है;) – gavinbeatty

2

यदि किसी तालिका के नाम में अमान्य वर्ण हैं तो आप इस तरह के डबल कोट्स में तालिका का नाम संलग्न कर सकते हैं।

sqlite> create table "test table" (id); 
sqlite> insert into "test table" values (1); 
sqlite> select * from "test table"; 
id 
---------- 
1 

बेशक आपको जब भी संभव हो अमान्य वर्णों का उपयोग करने से बचना चाहिए। यह विकास को जटिल बनाता है और लगभग हमेशा अनावश्यक होता है (आईएमओ केवल एक बार जब आवश्यक हो तब होता है जब आप किसी ऐसे प्रोजेक्ट को प्राप्त करते हैं जो पहले से ही किया जा चुका है और यह बदलने के लिए बहुत बड़ा है)।

+0

समस्या यह प्रोग्रामेटिक रूप से करना है। क्या कोई आधिकारिक विधि है? पहले स्रोत होने के लिए – gavinbeatty

+0

+1 मुझे मिल सकता है कि मुझे टेबल और कॉलम के लिए भागने वाला चरित्र बताया। जाहिर है कि मेरा google-fu आज कमजोर है ... –

+0

@ चार्ली किलियन, धन्यवाद, एसक्यूएल एक डेटाबेस से दूसरे डेटाबेस में काफी सुसंगत है, कठिन हिस्सा सभी छोटी असंगतताओं को ढूंढ रहा है। एसक्यूएल सर्वर और एक्सेस जैसे कुछ अन्य डेटाबेस, अवैध ऑब्जेक्ट नामों से बचने के लिए '[' और ']' का उपयोग करते हैं। sqlite ustes '" ', जो दिलचस्प रूप से तारों के लिए भी उपयोग किया जा सकता है, हालांकि' ''मानक है और एसकलाइट और अधिकांश डेटाबेस में समर्थित है। –

0

SQLite पैरामीटर, मुझे नहीं लगता कि आपकी समस्या के लिए एक समाधान के रूप में तालिका नाम स्वीकार नहीं करता है ...

को ध्यान में रखें कि:

पैरामीटर कि निर्दिष्ट नहीं किए जाते sqlite3_bind() का उपयोग करने वाले मानों को न्यूल के रूप में माना जाता है।

इसलिए आपकी क्वेरी के मामले में, तालिका का नाम शून्य होगा जो निश्चित रूप से अमान्य है।

+0

' sqlite3_prepare_v2' चरण विफल होने पर 'sqlite3_step'' के लिए कोई कथन नहीं है। I ' मैं पूछ रहा हूं कि कोई अन्य एपीआई एक टेबल नाम बांधने के लिए उपलब्ध है या नहीं। कुछ 'printf "% q" 'bash में' संपादित करें: स्वरूपण – gavinbeatty

+1

मेरा मतलब यह है कि आप एक ऐसा बयान तैयार नहीं कर सकते जो नेतृत्व कर सके पैरामीटर के गलत बाध्यकारी के लिए। –

1

SQLite का उपयोग करते समय मानकों के साथ विवरण तैयार पैरामीटर:

किसी भी एसक्यूएल बयान, SQLite "compiles" को क्रियान्वित करने से पहले "एक शाब्दिक मूल्य क्रम पर में भर जाता है कि के लिए अभिव्यक्ति में एक प्लेसहोल्डर निर्दिष्ट करता है" एसक्यूएल स्ट्रिंग opcodes की एक श्रृंखला में जो आंतरिक वर्चुअल मशीन द्वारा निष्पादित की जाती है। तालिका नाम और कॉलम नाम जिन पर SQL कथन संचालित होता है, संकलन प्रक्रिया के आवश्यक भाग हैं।

आप उपयोग पैरामीटर "मूल्यों" बाध्य कर सकते हैं करने के लिए इस तरह से तैयार बयान करने के लिए:

SELECT * FROM FOO WHERE name=?; 

और फिर sqlite3_bind_text() फोन पहले से ही संकलित बयान के स्ट्रिंग gavinbeatty बाध्य करने के लिए। हालांकि, इस वास्तुकला मतलब है कि आप नहीं इस तरह उपयोग मापदंडों सकते हैं कि:

SELECT * FROM ? WHERE name=?; // Can't bind table name as a parameter 
SELECT * FROM FOO WHERE ?=10; // Can't bind column name as a parameter 
+1

मुझे पता है कि तालिका का नाम बाध्य नहीं किया जा सकता है क्योंकि पार्स/संकलन चरण तालिका के नाम की आवश्यकता है। मैं परीक्षण करने के लिए एक स्थापित तरीका ढूंढ रहा हूं कि तालिका का नाम मान्य है या कैननिकलाइज करना है तालिका का नाम – gavinbeatty

0

मैं इस तरह कुछ ढूंढ रहा था और इसे भी नहीं मिला। मेरे मामले में, अपेक्षित तालिका नाम हमेशा टेबल के एक निश्चित सेट के बीच थे (इसलिए वे मान्य करने के लिए आसान थे)।दूसरी ओर फ़ील्ड नाम नहीं थे इसलिए मैंने स्ट्रिंग को फ़िल्टर करना समाप्त कर दिया, जो कि अक्षर, संख्या या अंडरस्कोर नहीं था, मुझे बहुत कुछ हटा रहा था (मुझे पता था कि मेरे फ़ील्ड इस पैरामीटर में फिट होंगे)। वह चाल है।

संबंधित मुद्दे