EloquentDataSource - ignore placeholders inside SQL comments and strings #744
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Hello! I noticed that if an Eloquent query contains comments, the
EloquentDataSource::createRunnableQueryfunction handles bindings replacement incorrectly.Case 1
When using named bindings and having a question mark inside SQL comments, an exception occurs:
Undefined array key 0atEloquentDataSource.php:274,because the function tries to replace the
?with a positional binding, but there is no binding with key0.How to reproduce:
Case 2
When using positional bindings and having a question mark inside SQL comments, the function incorrectly replaces question marks in the comment with bindings, instead of replacing only the real
?in the query.How to reproduce:
Result:
Fix
I propose to determine whether the bindings are positional before performing the replacements.
Eloquent allows queries to use either positional or named parameters.
I check whether the bindings are positional by verifying that the bindings array contains only numerically ordered keys.
The updated regular expression now ignores placeholders inside:
-- ...)/* ... */)'...')"...")This ensures that placeholders are replaced only where intended, preventing accidental replacements inside comments or strings.