PHP变量直接在sql语句中使用时的疑惑

本文探讨了在PHP中如何正确地在SQL语句里使用数组变量,对比了不同写法的效果,并解释了PHP语法分析器对于字符串和变量的不同处理方式。
本意是用sql语句查询,过程中用到了一个PHP脚本中的数组
奇怪的是,在PHP脚本中使用该数组值的时候用的是$user['name'],中括号内带单引号。而sql语句中直接使用该变量(不使用.进行拼接)时,却是$user[name] 不带单引号。
如图:

当在sql语句中使用$user['name']时,会产生以下报错:
错误信息:
syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in D:\Procedure\PHP\WWW\blog\login.php on line 23

经查询,得以下三种写法

其中第二种为常规写法,即使用拼接法,拼接PHP上的变量
第三种能够达到预期效果
但是浏览器会报一个NOTICE错误


虽然得到了解决问题的方法,但是对于PHP这种用法很不理解,google/baidu没有找到答案(也可能是我的搜索方式不对)。
让朋友帮忙在他的电脑上试过,结果与我的一样,基本可以排除是环境orPHP版本的问题。

希望能有高手指点一二,小弟将不胜感激!












答:


你应该先搞清楚 constant(常量)是什么意思
php 对于未被引号括起的字符串,先检查是否是常量,然后才解释为字串

当一个一维数组元素出现在双引号当中时:
"$ar[key]" 正确
"$ar['key']" 语法错
"{$ar[key]}" 使用了未定义常量
"{$ar['key']}" 正确

这是 php 文法分析程序内置的评判标准,没有为什么!

### 如何在 PHP使用 mysqli 或 PDO 执行 SQL 查询 #### 使用 mysqli 扩展执行 SQL 查询 为了通过 `mysqli` 进行查询,首先需要建立到 MySQL 数据库的连接。下面是一个简单的例子展示如何设置这种连接并执行一个 SELECT 查询: ```php <?php $url = "localhost"; $usr = "root"; $paw = "123"; $database = "mdb"; // 建立连接 $link = new mysqli($url, $usr, $paw, $database); // 检查连接状态 if ($link->connect_error) { die("Connection failed: " . $link->connect_error); } // 准备并绑定参数防止SQL注入攻击 $stmt = $link->prepare("SELECT gitid, cid FROM carts WHERE uid = ?"); $uid = 5; // 示例UID $stmt->bind_param("i", $uid); // 'i' 表明变量是整数类型 // 执行查询 $stmt->execute(); // 获取结果集 $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo "gitid: " . htmlspecialchars($row['gitid']) . ", cid: " . htmlspecialchars($row['cid']); } // 关闭语句和连接 $stmt->close(); $link->close(); ?> ``` 上述代码展示了安全地准备带有占位符的 SQL 语句,并利用 `bind_param()` 方法来绑定实际的数据[^3]。 #### 使用 PDO 执行 SQL 查询 对于 `PDO` 来说,过程稍微同一些,因为它支持多种数据库驱动程序而仅仅是 MySQL。这里是如何用它来做同样的事情的例子: ```php <?php try { $dsn = 'mysql:host=localhost;dbname=mdb;charset=utf8mb4'; $username = 'root'; $password = '123'; // 设置 PDO 错误模式为异常处理方式 $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; // 创建一个新的 PDO 实例 $pdo = new PDO($dsn, $username, $password, $options); // 预处理 SQL 描述 $sql = "SELECT gitid, cid FROM carts WHERE uid = :uid"; $stmt = $pdo->prepare($sql); // 绑定参数 $stmt->bindParam(':uid', $uid, PDO::PARAM_INT); $uid = 5; // 执行预处理语句 $stmt->execute(); // 取得结果集中的每一行作为关联数组 foreach ($stmt as $row) { printf("gitid: %s, cid: %s\n", htmlspecialchars($row['gitid']), htmlspecialchars($row['cid'])); } } catch (PDOException $e) { throw new PDOException($e->getMessage(), (int)$e->getCode()); } ?> ``` 这段脚本同样实现了相同的功能——从名为 `carts` 的表中检索数据,但是采用了更现代的方式来进行错误管理和安全性增强措施[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值