【发布时间】:2020-02-28 20:12:41
【问题描述】:
我正在制作一种数据共享系统,管理员可以在其中创建项目,向它们添加模板(例如:文本 1 最多只能有 20 个字符),然后将它们分配给用户。然后,用户可以根据自己的喜好更新项目(例如,更改默认文本)。
在下一个屏幕截图中,有一个用户如何在项目中查看的示例(西班牙语,抱歉):
问题是,当用户更新他的文本 1 时,文本 1 和 2 会同时更改,这甚至会转到分配给同一用户的各种其他项目。
文本更新完成的方式是这样的:
<div class="col-md-6 row">
<label for="texto_id" class="col-md-4 col-form-label">Change Text</label>
<br>
<select id="texto_id"
class="form-control @error('texto_id') is-invalid @enderror"
name="texto_id"
value="{{ old('texto_id') }}"
required autocomplete="texto_id"
autofocus>
<option value="null"> </option>
@foreach($proyecto_data as $prt_data)
@foreach($texto_data as $txt)
@foreach($texto_proyecto_data as $txt_prt)
@if($txt_prt->id_texto_data == $txt->id)
@if($txt_prt->id_proyecto_data == $prt_data->id)
<option value="{{ $txt->id }}">{{ $txt->nombre }} which has min {{ $txt->min }} and max {{ $txt->max }}</option>
@endif
@endif
@endforeach
@endforeach
@endforeach
</select>
@error('name')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
用户选择与他们关联的文本并编写新文本,以下是其屏幕截图:
之后,变量被发送到更新表格的 php 脚本,为此我尝试了接下来的 2 行:
$sql = "UPDATE texto_datas SET texto = " . $texto_valor . "WHERE id=" . $id_texto_valor;
和
DB::update('update texto_datas set texto = ?', $texto_array ,'where id = ?', $id_texto_valor);
第一个绝对不做任何事情,而第二个更改与用户关联的所有文本,立即忽略 where。
是不是我做错了什么?
【问题讨论】:
-
您的第一个选项什么都不做,因为它所做的只是创建一个名为
$sql的变量,其中包含一些文本。系统不会因为您以这种方式命名变量而神奇地知道您想将其作为 SQL 查询执行。 (如果确实如此,它将对 SQL 注入开放,并且由于文本字段周围缺少引号而失败。)