Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法获取增量大于10的数字_Php_Mysql - Fatal编程技术网

Php 无法获取增量大于10的数字

Php 无法获取增量大于10的数字,php,mysql,Php,Mysql,好吧,这是一个我从未见过的奇怪的。您将要看到的脚本位从表中获取一个值,分解它,然后增加存储在数组中的数字,这样我就可以使用它创建唯一的产品代码。然而,这个数字一旦达到10就拒绝增加。以下是脚本: $query = $this->mysqli_link->query("SELECT custom_id FROM sjs_custom_orders ORDER BY custom_id DESC LIMIT 1")->fetch_array(); $custom_id_old =

好吧,这是一个我从未见过的奇怪的。您将要看到的脚本位从表中获取一个值,分解它,然后增加存储在数组中的数字,这样我就可以使用它创建唯一的产品代码。然而,这个数字一旦达到10就拒绝增加。以下是脚本:

$query = $this->mysqli_link->query("SELECT custom_id FROM sjs_custom_orders ORDER BY custom_id DESC LIMIT 1")->fetch_array();
$custom_id_old = $query['custom_id'];
$custom_id_new_split = explode("/", $custom_id_old);
$custom_id = $custom_id_new_split[2] + 1;
$custom_id_new = "SJS/CUSTOM/" . $custom_id;
表本身的自定义_id列设置为varchar(100)


感谢您的帮助。

问题在于您的查询

ORDER BY custom\u id DESC

由于(不幸命名)
custom_id
列是字符类型,因此此值:

SJS/CUSTOM/9
SJS/CUSTOM/10
将在此值之前排序(按降序):

SJS/CUSTOM/9
SJS/CUSTOM/10
因为比较是一对一的。
'9'
大于
'1'
。作为人类,我们可能认为十大于九。但是MySQL只是在比较不同的字符。如果我们在
'9'
之前添加一个
'0'
字符,那么数据库将
'09'
'10'
进行比较,我们将更接近获得我们期望的结果


如果
custom_id
的值始终包含两个正斜杠,并且您希望数值位于最后一个正斜杠之后,则可以使用SQL表达式将其解析出来

SUBSTRING_INDEX(custom_id,'/',-1)+0
(Add a zero将字符串转换为数值。MySQL这样做很不可靠,它不会抛出错误,它会尽可能多地将前导部分转换为数值

如果始终有两条斜线,则还可以使用表达式获取第二条斜线之前的零件:

SUBSTRING_INDEX(custom_id,'/',2)
要获得“最大”值,您可以这样做

ORDER
   BY SUBSTRING_INDEX(custom_id,'/',2) DESC
    , SUBSTRING_INDEX(custom_id,'/',-1)+0 DESC 
LIMIT 1
注意:只要
custom\u id
始终包含两个正斜杠,此“操作”就有效。如果
custom\u id
的任何值都不是这样,则这些表达式的行为定义良好,但不太可能返回您想要的结果



MySQL将无法有效地使用索引来满足此查询;需要对表中的每一行计算这些表达式。如果您被这种不幸的设计所困扰,那么您就被困在其中。我们希望看到这些表达式的结果分别存储在两个单独的列中。

varchar问题。使用
int
问题是,自定义id是字母和数字的混合体。id不是PK,需要在客户端上创建。id中的文本在这里似乎非常冗余:您的表名是
sjs\u custom\u orders
,您的id以
sjs/custom/
开头。只需使用
int
s即可。您不能用它来计算textok spencer将尝试一下,感谢您的帮助,感谢您的帮助,我们将尝试探索不同的方法,让代码在未来工作,而不必进行低效的查询:)再次感谢