错误报告通知:
Undefined variable: random_chars in wamp'www'php_sandbox'idgen.php on line 21
Call Stack:
# Time Memory Function Location
1 0.0045 678928 {main}( ) ..'idgen.php:0
GPB7446
如何修复此错误?
将此代码用作自动唯一id生成器。我如何连接到数据库验证代码是真正唯一之前允许它被分配给用户创建一个新帐户?
感谢<?php
$characters = array(
"A","B","E","F","G","H","J","K","M","N","P","R","S","T","W","X","Y","Z");
$keys = array();
while(count($keys) < 3) {
$x = mt_rand(0, count($characters)-1);
if(!in_array($x, $keys)) {
$keys[] = $x;
}
}
foreach($keys as $key){
$random_chars .= $characters[$key];}
$randNum = rand(2327,9987); $randLet = rand(2327,9987);
echo $random_chars . $randNum;
?>
您没有初始化$random_chars
-在连接它之前尝试将其设置为空字符串。
...
$random_chars="";
foreach($keys as $key){
$random_chars .= $characters[$key];
}
$randNum = rand(2327,9987); $randLet = rand(2327,9987);
echo $random_chars . $randNum;
...
如果你使用长手语法,你得到错误的原因就更清楚了…
$random_chars .= $characters[$key];
与
相同 $random_chars = $random_chars . $characters[$key];
第一次运行这行代码时,$random_chars
不存在。
至于检查数据库,这取决于你使用的数据访问机制。
你需要发出一个类似的查询:
SELECT COUNT(*) As RecordCount FROM MyUserTable WHERE MyIdColumn = 'ABC123'
然后读取返回记录集的第一行的RecordCount值。如果不存在,则为0;如果存在,则为>0。
编辑:To澄清数据库位…
基本流程如下:
在开发过程中:
- 创建数据库
- 添加一个表记录这些id
:
- 创建数据库连接
- 发送一个查询,询问有多少条记录已经具有该Id
- 获取响应("结果集")
- 检查结果集以查看服务器所说的内容。
一个冗长但详细的PHP和MySQL介绍可以在这里找到:http://www.freewebmasterhelp.com/tutorials/phpmysql
你还应该阅读一些叫做"SQL注入"的东西,当你开发任何使用数据库的网站时,你需要意识到这一点,并且可以被其他人看到。
下面是一些示例代码。您需要更改表和列名,使其与创建数据库时使用的名称相匹配。我假设Db服务器与web服务器是同一台机器-如果不是,将localhost更改为适当的IP/主机名。
$user="username";
$password="password";
$database="database";
mysql_connect("localhost",$user,$password); //Connect to server
@mysql_select_db($database) or die( "Unable to select database"); //Select your database
$query="SELECT * FROM MyUserTable WHERE MyIdColumn = '" . mysql_real_escape_string($random_chars . $randNum) . "'"; //Define the query
$recordset = mysql_query($query);//Run it
$matchingRecordCount = mysql_numrows($recordset)
mysql_close();//Close the Db connection
if(matchingRecordCount>0) {
//It's already in there, generate another
} else {
//It's not already in there
}
只是为了确保你知道,数据库已经非常好和快速发出唯一的id(阅读AUTO_INCREMENT),所以除非你真的想要这种格式,否则考虑使用它。
你必须声明和初始化$random_chars
之前,你开始连接的东西。
下面固定。我将random_chars设置为空字符串。$random_chars = "";
$characters = array("A","B","E","F","G","H","J","K","M","N","P","R","S","T","W","X","Y","Z");
$keys = array();
while(count($keys) < 3) {
$x = mt_rand(0, count($characters)-1);
if(!in_array($x, $keys)) {
$keys[] = $x;}
}
$random_chars = ""; //Here
foreach($keys as $key){
$random_chars .= $characters[$key];
}
$randNum = rand(2327,9987); $randLet = rand(2327,9987);
echo $random_chars . $randNum;
在循环前将$random_chars
初始化为空字符串:
$random_chars = "";
foreach($keys as $key) {
$random_chars .= $characters[$key];
}
你可以将$random_chars = "";
声明在foreach($keys as $key)
之上这样就可以解决问题了