Unity与SQL Server通过PHP对接:num_rows函数无效,求解决方法
问题解决:替代
num_rows的方法及代码优化 你遇到的num_rows无法识别的问题,是因为SQL Server的PHP扩展(sqlsrv)不支持通过对象属性->num_rows获取行数,需要使用sqlsrv扩展提供的专用函数替代,同时还要优化代码避免安全风险。
替代方案1:用sqlsrv_has_rows()判断数据是否存在
这个函数直接检查结果集是否包含行,完美适配你判断ID是否存在的场景:
$loginID = $_POST["loginID"]; $loginName = $_POST["loginName"]; $loginEmail = $_POST["loginEmail"]; // 使用参数化查询避免SQL注入风险 $sql = "SELECT id FROM testing WHERE id = ?"; $params = array($loginID); $result = sqlsrv_query($conn, $sql, $params); if ($result && sqlsrv_has_rows($result)) { echo "Staff ID exists"; } else { echo "Creating user..."; // 插入数据同样使用参数化查询 $sql2 = "INSERT INTO testing (id,name,email) VALUES (?, ?, ?)"; $params2 = array($loginID, $loginName, $loginEmail); $result1 = sqlsrv_query($conn, $sql2, $params2); if ($result1) { echo " New user has been created successfully"; } else { echo "Error: Insert failed. "; // 获取sqlsrv专属错误信息 if( ($errors = sqlsrv_errors() ) != null) { foreach( $errors as $error ) { echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />"; echo "Code: ".$error[ 'code']."<br />"; echo "Message: ".$error[ 'message']."<br />"; } } } }
替代方案2:用sqlsrv_num_rows()获取具体行数
如果需要知道结果集的确切行数,可使用这个函数,但需要先设置结果集为可滚动类型:
$sql = "SELECT id FROM testing WHERE id = ?"; $params = array($loginID); // 设置结果集为可滚动,确保sqlsrv_num_rows能返回正确行数 $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET); $result = sqlsrv_query($conn, $sql, $params, $options); if ($result) { $rowCount = sqlsrv_num_rows($result); if ($rowCount > 0) { echo "Staff ID exists"; } else { // 执行用户创建逻辑 } }
额外优化说明
- SQL注入防护:原代码直接拼接POST参数到SQL语句中存在严重安全风险,必须用参数化查询(
?占位符+参数数组)替代。 - 错误处理修正:sqlsrv扩展的错误信息需通过
sqlsrv_errors()获取,而非$conn->error(这是mysqli扩展的用法)。 - Unity端代码无需修改:你的Unity注册逻辑代码完全正常,只要PHP端返回正确文本,Unity就能正常接收并处理。
内容的提问来源于stack exchange,提问作者Shifaul Rosman
相关产品推荐
相关产品推荐

