我的代码不起作用,我不知道为什么[关闭]

问题描述 投票:0回答:1

**

强文字

**我正在尝试使用以下代码更新特定表:

if(isset($_GET["id"])){
$id = (int)$_GET['id'];
      
//Checking for expected id    
if ($id!="" AND $id!=0){
    
    //Update Contact1
    $array1 = array(
              "Cn_First_Name"=>$ClientFirstNameMain,
              "Cn_Last_Name"=>$ClientLastNameMain,
              "Cn_Mobile"=>$ClientMobileMain,
              "Cn_Email"=>$ClientEmailMain,
            );
                
    // Finally Inserting Array Data in Table
    $QUpdateContact1Pr = "UPDATE `TB_Contacts` SET ";
    foreach($array1 as $key=>$value) {
        $QUpdateContact1Pr .="`".$key."`= ? , "; 
    }
    $QUpdateContact1Pr = trim($QUpdateContact1Pr, ' ');
    $QUpdateContact1Pr = trim($QUpdateContact1Pr, ',');
    $QUpdateContact1Pr.= " WHERE `Con_ClientID`= ? AND `Con_Priority`='1'";
    
    //Trying to find the issue of $id by Making a simple echo $id/2 shows the actual half integer of the GET[id] value...

    if($stmt2 = mysqli_prepare($LocDbCon, $QUpdateContact1Pr)){
    //Tried also here to make a $id = 310; and bypass the value that comes from GET[id] value and still get the same issue...
mysqli_stmt_bind_param($stmt2,'ssssi',$ClientFirstNameMain,$ClientLastNameMain,$ClientMobileMain,$ClientEmailMain,$id);
        $UpdatedContact1=mysqli_stmt_execute($stmt2);
    } 
}else{
    //Return to Index Screen
    header('location:Index.php');
}
}else{
    //Return to Index Screen
    header('location:Index.php');
} 

我收到以下错误:

致命错误:未捕获 mysqli_sql_exception:截断了不正确的 DECIMAL 值:xxxxx/UpdateClient.php:108 中的 ''
堆栈跟踪:
#0 xxxxx/UpdateClient.php(108): mysqli_stmt_execute(对象(mysqli_stmt))
#1 {main} 抛出在 xxxx/UpdateClient.php 第 108 行

我做错了什么? PS 如果重要的话我正在使用 PHP 8.2...

问题已解决....不小心将 ClientID 作为 varchar 而不是整数放入数据库中。愚蠢的错误。感谢大家抽出时间! :)

php sql mysqli
1个回答
-2
投票

永远不要相信用户输入。 ;)

为了确保 $id 是 int 类型,你至少应该进行类型转换

$id = (int)$_GET['id'];

这将导致所有无法解析为 int 的用户输入的 $id 为 0。由于 SQL 中 ids 通常从 1 开始,因此您可以检查 $id 是否为 0,并且不执行该语句,而是返回错误。当然,如果 0 确实是一个有效的 id,这种方法就行不通。

我尝试重现该错误,但使用以下代码一切正常

<?php
// Test case
$LocDbCon = mysqli_connect('localhost', 'test', 'test', 'test');
$ClientFirstNameMain = 'John';
$ClientLastNameMain = 'Doe';
$ClientMobileMain = '555-NOSE';
$ClientEmailMain = '[email protected]';
$_GET['id'] = '130';

$id = (int)$_GET['id'];

if ($id>0){
    
    //Update Contact1
    $array1 = array(
        "Cn_First_Name"=>$ClientFirstNameMain,
        "Cn_Last_Name"=>$ClientLastNameMain,
        "Cn_Mobile"=>$ClientMobileMain,
        "Cn_Email"=>$ClientEmailMain,
    );
                
    // Finally Inserting Array Data in Table
    $QUpdateContact1Pr = "UPDATE `TB_Contacts` SET ";
    foreach($array1 as $key=>$value) {
        $QUpdateContact1Pr .="`".$key."`= ? , "; 
    }
    $QUpdateContact1Pr = trim($QUpdateContact1Pr, ' ');
    $QUpdateContact1Pr = trim($QUpdateContact1Pr, ',');
    $QUpdateContact1Pr.= " WHERE `Con_ClientID`= ? AND `Con_Priority`='1'";

    if($stmt2 = mysqli_prepare($LocDbCon, $QUpdateContact1Pr)){

    mysqli_stmt_bind_param($stmt2,'ssssi',$ClientFirstNameMain,$ClientLastNameMain,$ClientMobileMain,$ClientEmailMain,$id);
        $UpdatedContact1=mysqli_stmt_execute($stmt2);
    } 
}

在这张桌子上

CREATE TABLE `TB_Contacts` (
    `Con_ClientID` bigint(20) UNSIGNED NOT NULL,
    `Con_Priority` tinyint(4) NOT NULL,
    `Cn_First_Name` varchar(200) NOT NULL,
    `Cn_Last_Name` varchar(200) NOT NULL,
    `Cn_Mobile` varchar(200) NOT NULL,
    `Cn_Email` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

ALTER TABLE `TB_Contacts`
    ADD PRIMARY KEY (`Con_ClientID`);
COMMIT;

您介意发布您的表模式,包括存储过程、触发器和其他内容吗?

© www.soinside.com 2019 - 2024. All rights reserved.