यही त्रुटि उत्पन्न कर रहा है:
$this->data->query('CREATE TABLE $this->subdomain');
$this->data->bind(':subdomain', $this->subdomain);
जैसा कि माइकल बर्कोव्स्की और एंड्रयूसी ने टिप्पणियों में उल्लेख किया है, आप मूल्य को :subdomain
से नहीं बांध सकते प्लेसहोल्डर क्योंकि इसे क्वेरी में नोट नहीं किया गया है और भले ही यह पीडीओ प्लेसहोल्डर्स का उपयोग केवल मानों के लिए किया जा सकता है, डेटाबेस, टेबल या कॉलम नामों के लिए नहीं ।
यदि आप चाहते हैं कि इस प्रकार की SQL क्वेरी गतिशील रूप से बनाई जाए तो आपको बैकटिक उद्धरणों में डेटाबेस, तालिका या स्तंभ नामों को संलग्न करना होगा (यदि आपके कॉलम और नामों में SQL आरक्षित कीवर्ड हैं जो क्वेरी को तोड़ सकते हैं) और एस्केप वैल्यू जो रखे गए हैं, लेकिन आप MySQLi
. का उपयोग नहीं कर सकते हैं उसके लिए यदि पहले से ही PDO
. का उपयोग कर रहे हैं ।
चूंकि पीडीओ real_escape_string()
के साथ नहीं आता है विधि जो बस यही करेगी, और व्यवहार में इस तरह के मूल्यों से बचने की आवश्यकता नहीं है (जब तक कि आपके पास वास्तव में Ye'name
जैसे नाम वाले कॉलम न हों। जो पूरी तरह से बेवकूफ IMHO है), इतना आसान फ़िल्टर preg_match()
. का उपयोग करके या preg_replace()
काफी अच्छा है:
if (preg_match('/^[\w_]+$/i', $this->subdomain)) {
// note the ` (backtick), and using " (double quotes):
$this->data->query("CREATE TABLE `{$this->subdomain}`");
} else {
// throw exception or error, do not continue with creating table
}
'
. का उपयोग करने के कुछ उदाहरण (एकल उद्धरण - एपॉस्ट्रॉफ़ी) "
. के विरुद्ध (दोहरे उद्धरण) PHP में तार:
$a = 1;
$b = 2;
echo '$a + $b'; // outputs: $a + $b
echo "$a + $b"; // outputs: 1 + 2
$c = array(5, 10);
echo '\$c[0] = {$c[0]}'; // outputs: \$c[0] = {$c[0]}
echo "\$c[0] = {$c[0]}"; // outputs: $c[0] = 5
{}
डबल कोट्स के अंदर स्ट्रिंग का उपयोग सरणियों और ऑब्जेक्ट प्रॉपर्टी एक्सेस के लिए किया जाता है और इसे नियमित चर के आसपास इस्तेमाल किया जा सकता है।
$
से बचना डबल कोट्स में \$
. द्वारा किया जाता है अन्यथा यह एक परिवर्तनीय कॉल मान लेगा।