मेरे द्वारा पास की गई DB::select क्वेरी स्ट्रिंग को प्रारूपित करने के लिए sprintf के बजाय vsprintf का उपयोग करते समय मुझे समस्या हो रही है। मैंने उन्मूलन के माध्यम से समस्या को कम कर दिया है। सबसे पहले मैंने एक स्ट्रिंग में एक वेरिएबल डालने के लिए sprintf का उपयोग करने का प्रयास किया। मैंने उस स्ट्रिंग को DB::select के पैरामीटर के रूप में इस्तेमाल किया:

$query = sprintf("SELECT * FROM test_posts WHERE post_slug = %s;", $post_slug);
$result = DB::select($query);

dd($result);

परिणाम ठीक रहा। मैंने एक स्ट्रिंग में एकाधिक चर डालने की अनुमति देने के लिए कोड संशोधित किया है:

$table = 'test_posts';
$column = 'post_slug';
$query = vsprintf("SELECT * FROM %s WHERE %s = '%s';", [$table, $column, $identifier_slug]);
$rslt_post = DB::select($query);

//return view('post_viewer', ['arr_post' => $rslt_post] );

echo "<pre>";
print_r($rslt_post);        
dd($rslt_post);

परिणाम दोनों कोड प्रकारों के लिए ठीक और समान था:

Array
(
    [0] => stdClass Object
        (
            [post_ctr] => 2
            [post_slug] => my-first-post
            [posted_by] => J_Rives
            [date_posted] => 2020-02-03 09:03
            [last_edit] => 2020-02-03 16:54
            [post_body] => Test post #2. Ctr = 2, No title.
        )

)
array:1 [▼
  0 => {#250 ▶}
]

मैंने पैरामीटर के रूप में पारित परिणाम वस्तु के साथ एक दृश्य वापस करने का प्रयास किया।
return view('post_viewer', ['arr_post' => $rslt_post] );

परिणाम निम्न त्रुटि संदेश था:

Facade\Ignition\Exceptions\ViewException
Trying to get property 'posted_by' of non-object (View: C:\Users\7\testproject1.0\resources\views\post_viewer.blade.php)
http://127.0.0.1:8000/posts/my-first-post

post_viewer.blade.php में संदर्भित लाइन यह है:
<h4> {{ $arr_post->posted_by }} </h4>

यह क्यों दावा करता है कि एक सरणी वस्तु के रूप में dd और print_r द्वारा सत्यापित एक चर एक "गैर-वस्तु" है जिससे मैंने "शीर्षक" नामक "संपत्ति" तक पहुंचने का प्रयास किया?

0
Joachim Rives 7 मार्च 2020, 14:56
1
आपका $arr_post एक सरणी है। $arr_post[0]->posted_by ठीक होना चाहिए
 – 
katsarov
7 मार्च 2020, 15:23
धन्यवाद। ध्यान दें और इसे भी आजमाएं। फिर भी, क्या आप जानते हैं कि vsprintf इस प्रभाव का कारण क्यों बनता है? क्या यह भी सच है कि vsprintf ठीक है और यह मेरे परीक्षण प्रोजेक्ट में कुछ ऐसा है जो त्रुटि का मूल कारण है?
 – 
Joachim Rives
9 मार्च 2020, 06:16
क्या आप इस बारे में अधिक विवरण साझा कर सकते हैं कि vsprintf यहां कैसे संबंधित है? यदि क्वेरी समान है तो निष्पादित डेटाबेस क्वेरी का रिटर्न मान बिल्कुल समान होना चाहिए
 – 
Nico Haase
9 मार्च 2020, 13:47
आप लारवेल का उपयोग क्यों कर रहे हैं? क्या ऐसा नहीं है कि आप TestPost::where('post_slug', $post_slug)->get(); जैसे काम कर सकते हैं???
 – 
miken32
9 मार्च 2020, 23:32
हाँ, मैंने यही सोचा था। जब मैं sprintf का उपयोग करता हूं तो यह एक ऑब्जेक्ट देता है लेकिन vsprintf ऐसा लगता है कि यह या तो "गैर-ऑब्जेक्ट" लौटाता है - त्रुटि संदेश के अनुसार - या एक सरणी जैसा कि नीचे टिप्पणी में कहा गया है। सवाल है, क्यों? vsprintf एक ही क्वेरी के लिए अलग परिणाम क्यों दे रहा है?
 – 
Joachim Rives
10 मार्च 2020, 14:36

1 उत्तर

सबसे बढ़िया उत्तर

sprintf या vsprintf की कोई आवश्यकता नहीं है

$result = DB::select("SELECT * FROM test_posts WHERE post_slug = :slug", ['slug' => $post_slug]);

और पूरी तरह से गतिशील

$names = ['test_posts', 'comments'];
$columns = ['post_slug', 'comment_slug'];
foreach($names as $i => $tableName){
     $rslt_post = DB::table($tableName)->where($columns[$i], $identifier_slug);
}

0
Ronak Dhoot 9 मार्च 2020, 13:44
क्या 'post_slug' और 'comment_slug' के बीच अल्पविराम नहीं होना चाहिए? वह जानकारी देने के लिए धन्यवाद। मैं इस उत्तर को डॉक्स में पढ़े गए नोट्स के साथ भी पूरक करूंगा। फिर भी, यह त्रुटि क्यों होती है? मैं समस्या को हल करने में कामयाब रहा लेकिन फिर भी जानना चाहता हूं कि vsprintf ने त्रुटि क्यों की, भले ही यह sprintf की तरह एक स्ट्रिंग लौटाए।
 – 
Joachim Rives
9 मार्च 2020, 06:15
कोड को अपडेट किया गया, मुझे यह भी यकीन नहीं है कि यह केवल रिटर्न स्ट्रिंग दोनों के रूप में क्यों होता है ...
 – 
Ronak Dhoot
9 मार्च 2020, 13:46