> 백엔드 개발 > PHP 튜토리얼 > pdo预处理时,需要绑定字段,但是出现了问题

pdo预处理时,需要绑定字段,但是出现了问题

WBOY
풀어 주다: 2016-07-06 13:53:12
원래의
1213명이 탐색했습니다.

需要向数据库查询,但是字段和字段值都是客户端传过来的,所以sql语句是这么写的

<code>$sql="select id from goods_type_attr where :field=:value and type_id=:type_id";
$this->stmt=$this->pdo->prepare($sql);
$this->stmt->execute($arr);
</code>
로그인 후 복사
로그인 후 복사

但是字段名field最后也被做了处理,结果应该是成了selecte ·· from xx where '字段'=····
' 而不是 `,所以导致查不出结果,请问该如何绑定一个字段名呢?
谢谢诸位

回复内容:

需要向数据库查询,但是字段和字段值都是客户端传过来的,所以sql语句是这么写的

<code>$sql="select id from goods_type_attr where :field=:value and type_id=:type_id";
$this->stmt=$this->pdo->prepare($sql);
$this->stmt->execute($arr);
</code>
로그인 후 복사
로그인 후 복사

但是字段名field最后也被做了处理,结果应该是成了selecte ·· from xx where '字段'=····
' 而不是 `,所以导致查不出结果,请问该如何绑定一个字段名呢?
谢谢诸位

为什么要这样处理呢?

可以定义一个数组 比如

<code>$field = [
    'name'    =>    'name',
    'type'    =>    'type'
];
$field = $field[$_GET['field']];</code>
로그인 후 복사

这样总不会有注入了吧

我个人建议你最好把你要变更都字段单独做处理之后当作一个变量赋值,字段和值都设置成预处理形式PDO貌似不能识别

<code class="php">$sql="select id from goods_type_attr where #field1#=:value and type_id=:type_id";
$sql = str_replace("#field1#", $param_field, $sql);
$this->stmt=$this->pdo->prepare($sql);
$this->stmt->execute($arr);</code>
로그인 후 복사

汗,你这也太死板了。字段名单独处理一下,例如

<code>$field = str_replace('`', '', $field);
$sql = "... `{$field}` = :fieldValue";</code>
로그인 후 복사

事实上通常客户端是不能直接传递字段名的,比较危险,最好是用下拉框选择,后台再处理,比如

<code>$useableFields = array('f1', 'f2', 'f3');
if (isset($useableFields['request_field_number']))
    $selectedField = $useableFields['request_field_number'];
else
    $selectedField = false;</code>
로그인 후 복사

绑定只能绑定值,字段名要自己处理

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿